我有一个字典列表:
mylist1 = [{'model': 'one'}, {'color': 'blue'}, {'age': 23}]
有没有办法可以根据密钥查找字典?对于我想要做的事情(伪代码):
mylist1['model'] #should return {'model': 'one'}
我没有做mylist[0]['model']
的原因是因为列表元素并不总是按顺序排列。有人可以帮忙吗?
提前致谢!
答案 0 :(得分:3)
你提供的伪代码是不可能的,除非你是子类(或猴子补丁)list
(否则你会得到一个错误,列表索引必须是整数而不是字符串)。
但是你可以写一个像
这样的函数def find(li, key):
for d in li:
if key in d:
return d
它将查找并返回包含给定键的第一个字典,并且如果键不唯一,可以轻松修改以返回字典列表。
看起来你正在使用字典错误。为什么你有一个字典列表,每个字典都有(显然)唯一的键,而不是一个字典?
答案 1 :(得分:3)
折叠字典。
d = {k : v for d in mylist1 for k, v in d.items()}
d
{'age': 23, 'color': 'blue', 'model': 'one'}
现在,只需查询常量O(1)
时间。
d['model']
'one'
通过在同一个列表中保留多个不相交的dict
,您首先会打败他们的目的。
如果您有多个可能的值使用相同的键,请使用dict
list
s。
d = {}
for dct in mylist1:
for k, v in dct.items():
d.setdefault(k, []).append(v)
d
{'age': [23], 'color': ['blue'], 'model': ['one']}
使用相同的键支持多个值而不覆盖条目,就像之前的那样。
答案 2 :(得分:1)
使用x[(a,b)]
,找到包含该list comprehension
的{{1}}中的所有dictionaries
:
list
注意OP:正如其他人所指出的那样,其中有一个字典列表是多余的; 除非您的词典包含重复的。
答案 3 :(得分:1)
key = "model"
d = [ x for x in mylist if key in x ]
如果你只想要一场比赛:
key = "model"
d = next( x for x in mylist if key in x )
第二个使用生成器,所以它只找到第一个匹配然后停止。