我在完成一项简单的任务时遇到了一些麻烦。
我有两个列表(长度相同),如下所示:
f1 = ['Shallow', 'Shallow', 'Shallow', 'Shallow', 'Shallow', 'Deep', 'Deep', 'Deep', 'Shallow', 'Shallow', 'Shallow', 'Shallow', 'Shallow', 'Shallow', 'Shallow', 'Deep', 'Deep']
f2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
我想要构建的是一个字典,其密钥取自f1
,值应该是相应密钥的数字列表(f2
包含一些唯一的ID)。
类似的东西:
d = {}
d['Shallow'] = [0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 13, 14]
d['Deep'] = [5, 6, 7, 15, 16]
我尝试使用zip
进行循环,但我肯定错过了一些内容,只附上了最后一项:
d = {}
for i, j in zip(f1, f2):
d[i] = []
d[i].append(j)
感谢您的任何建议
答案 0 :(得分:4)
问题是d[i] = []
将始终使用新的空列表覆盖'Shallow'
或'Deep'
的条目。你想要的只是在它还没有出现时才这样做:
d = {}
for i, j in zip(f1, f2):
if i not in d:
d[i] = []
d[i].append(j)
或者,使用defaultdict
自动处理此问题:
from collections import defaultdict
d = defaultdict(list)
for i, j in zip(f1, f2):
d[i].append(j)
答案 1 :(得分:2)
实际上有几种简单的方法可以在列表中查找内容。在StackOverflow上已有多种解决方案:
一种简单的方法是python生成索引列表:
matches = [index for index, value in enumerate(SomeList) if value == 'SomeValue']
所以你的案件的代码是:
f1 = ['Shallow', 'Shallow', 'Shallow', 'Shallow', 'Shallow', 'Deep', 'Deep', 'Deep', 'Shallow', 'Shallow', 'Shallow', 'Shallow', 'Shallow', 'Shallow', 'Shallow', 'Deep', 'Deep']
d = {}
d['Shallow'] = [index for index, value in enumerate(f1) if value == 'Shallow']
d['Deep'] = [index for index, value in enumerate(f1) if value == 'Deep' ]
print(d)
这将产生下一个结果:
{'Shallow': [0, 1, 2, 3, 4, 8, 9, 10, 11, 12, 13, 14], 'Deep': [5, 6, 7, 15, 16]}
此代码未经过优化,并且“重复”了它。也不使用“f2”列表(您可以根据“f1”的索引从“f2”获取值)。但这是理解一般想法的原因。