我有一个这样的列表:
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
注释:
为了使用
next
,您需要一个实际的迭代器,而不仅仅是一个可以迭代的对象(如列表(。要从可迭代对象中获取迭代器,可以使用iter
内置函数。一旦有了迭代器,就可以在
for
语句中使用它,就像使用可迭代程序一样。事实上,for
的实现从一个可迭代项创建了一个迭代器,所以只有在有额外需求的情况下,您才需要自己完成。(如果您或for
循环在迭代器上调用iter
,它会返回迭代器本身。(在迭代器上调用
next
将返回下一个值并推进迭代器。由于for
循环使用相同的迭代器,因此它不会看到通过显式调用next
提取的值。如果没有下一个元素(这将是一个输入错误(,
next
将引发StopIteration
,但这不会导致for
循环安静地终止;只有当CCD_ 18在CCD_。CCD_ 20不是非常有用的错误指示;最好用try
语句捕获异常并抛出更有意义的异常。我没有这么做是因为这有点分散注意力,但是。。。如果键/值对后面有
!
以外的内容,则此代码确实尝试引发一个有意义的异常。您可能很乐意丢弃多余的项而不产生错误消息(取决于您预期的输入(,在这种情况下,您可以删除elif
和以下语句。
附录:一个非迭代的解决方案,尽管它明确没有被要求:
d = { k: next(it) for it in [iter(my_list)] for k in it if k[0] == '@' }