迭代时如何将键和值存储在字典中



我有一个这样的列表:

my_list = ['@F1', 'OBCD', '!', '@F2', 'ADDAB', '!', '@F3', 'OKKA', '!']

我想把它变成一本这样的字典:

{'@F1': 'OBCD', '@F2': 'ADDAB', '@F3': 'OKKA'}

然而,我被这个卡住了:

my_dict = {}
for i in my_list:
if i[0] != '@' and i[0].isalpha() == False:
#pass
else:
my_dict[i] = my_list.next(i)

我知道.next(I(不起作用,但我基本上是想说";得到我之后。

如果有人有一个解决方案,你能不能让它不断迭代和详细说明,因为我会迷失在那些有很多事情发生的串联响应中

您可以使用enumerate()生成索引,以便访问列表中的"下一个"项目:

my_list = ['@F1', 'OBCD', '!', '@F2', 'ADDAB', '!', '@F3', 'OKKA', '!']
my_dict = {}
for idx,item in enumerate(my_list):
if item[0] == '@':
my_dict[item] = my_list[idx+1]
print(my_dict)

按要求输出。

请注意,这依赖于表示键的当前格式"@",并且总是有另一个元素作为值。

使用enumerate()。这将返回项目和索引。它遍历列表,如果它在该项中看到@,它将使用该字符串存储下一个项作为索引。

所以你的代码会像这样-

my_list = ['@F1', 'OBCD', '!', '@F2', 'ADDAB', '!', '@F3', 'OKKA', '!']
# expected: {'@F1': 'OBCD', '@F2': 'ADDAB', '@F3': 'OKKA'}
my_dict = {}
for indx, item in enumerate(my_list):
if '@' in item:
my_dict[item] = my_list[indx+1]
print(my_dict)

结果

{'@F1': 'OBCD', '@F2': 'ADDAB', '@F3': 'OKKA'}

如果你想确保索引字符串必须以@开头,那么

for indx, item in enumerate(my_list):
if item[0] == '@':
my_dict[item] = my_list[indx+1]

希望这能有所帮助。快乐编码!

很明显,您不必显式检查"!"因为列表数据是以3为一组的。因此:

my_list = ['@F1', 'OBCD', '!', '@F2', 'ADDAB', '!', '@F3', 'OKKA', '!']
my_dict = {my_list[i]: my_list[i+1] for i in range(0, len(my_list), 3)}
print(my_dict)

输出:

{'@F1': 'OBCD', '@F2': 'ADDAB', '@F3': 'OKKA'}

以下是使用next的方法。

def make_dict(lst):
it = iter(lst)           # Note 1
d = {}
for k in it:             # Note 2
if k[0] == '@':
d[k] = next(it)  # Notes 3, 4
elif k != '!':       # Note 5 
raise ValueError(f"Expected '!' but received {k}")
return d

注释:

  1. 为了使用next,您需要一个实际的迭代器,而不仅仅是一个可以迭代的对象(如列表(。要从可迭代对象中获取迭代器,可以使用iter内置函数。

  2. 一旦有了迭代器,就可以在for语句中使用它,就像使用可迭代程序一样。事实上,for的实现从一个可迭代项创建了一个迭代器,所以只有在有额外需求的情况下,您才需要自己完成。(如果您或for循环在迭代器上调用iter,它会返回迭代器本身。(

  3. 在迭代器上调用next将返回下一个值并推进迭代器。由于for循环使用相同的迭代器,因此它不会看到通过显式调用next提取的值。

  4. 如果没有下一个元素(这将是一个输入错误(,next将引发StopIteration,但这不会导致for循环安静地终止;只有当CCD_ 18在CCD_。CCD_ 20不是非常有用的错误指示;最好用try语句捕获异常并抛出更有意义的异常。我没有这么做是因为这有点分散注意力,但是。。。

  5. 如果键/值对后面有!以外的内容,则此代码确实尝试引发一个有意义的异常。您可能很乐意丢弃多余的项而不产生错误消息(取决于您预期的输入(,在这种情况下,您可以删除elif和以下语句。

附录:一个非迭代的解决方案,尽管它明确没有被要求:

d = { k: next(it) for it in [iter(my_list)] for k in it if k[0] == '@' }

最新更新