1:字典python中的n值

时间:2017-08-15 08:15:49

标签: python dictionary

我在完成一项简单的任务时遇到了一些麻烦。

我有两个列表(长度相同),如下所示:

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)

感谢您的任何建议

2 个答案:

答案 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上已有多种解决方案:

Example 1

Example 2

一种简单的方法是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”获取值)。但这是理解一般想法的原因。