获取词典列表
sample_dict = [
{'a': 'woot', 'b': 'nope', 'c': 'duh', 'd': 'rough', 'e': '1'},
{'a': 'coot', 'b': 'nope', 'c': 'ruh', 'd': 'rough', 'e': '2'},
{'a': 'doot', 'b': 'nope', 'c': 'suh', 'd': 'rough', 'e': '3'},
{'a': 'soot', 'b': 'nope', 'c': 'fuh', 'd': 'rough', 'e': '4'},
{'a': 'toot', 'b': 'nope', 'c': 'cuh', 'd': 'rough', 'e': '1'}
]
如何创建一个单独的字典,其中包含与某个键匹配的所有键值对。通过列表理解,我创建了一个包含所有键值对的列表:
container = [[key,val] for s in sample_dict for key,val in s.iteritems() if key == 'a']
现在容器给了我
[['a', 'woot'], ['a', 'coot'], ['a', 'doot'], ['a', 'soot'], ['a', 'toot']]
这一切都很好......但是如果我想对字典做同样的事情,我只得到一个单键,值对。为什么会这样?
container = {key : val for s in sample_dict for key,val in s.iteritems() if key == 'a'}
容器只提供一个元素
{'a': 'toot'}
我想要像
这样的东西{'a': ['woot','coot','doot','soot','toot']}
如何对上面的代码进行最少的更改?
答案 0 :(得分:4)
您使用相同的密钥生成多个键值对,而字典只会存储唯一的键。
如果您只想要一个键,则可以使用带有列表理解的字典:
container = {'a': [s['a'] for s in sample_dict if 'a' in s]}
请注意,如果您想要的只是一个特定的密钥,则无需迭代sample_dict
中的嵌套字典;在上面我只是测试密钥是否存在('a' in s
)并用s['a']
提取该密钥的值。这比快比循环遍历所有键。
答案 1 :(得分:-1)
另一种选择:
filter = lambda arr, x: { x: [ e.get(x) for e in arr] }
因此,从这里开始,您可以根据原始数组和键
构造dict filter(sample_dict, 'a')
# {'a': ['woot', 'coot', 'doot', 'soot', 'toot']}