假设一个字典列表,例如:
a = {'key': 5705435, 'key2': 1, 'data': 'data'}
b = {'key': 2345435, 'key2': 1, 'data': 'data'}
c = {'key': 9155435, 'key2': 2, 'data': 'data'}
data = [a,b,c]
我想从该列表中获得与给定键匹配的字典(例如,返回key == 2345435
的dict或key == 9155435 and key2 == 2
的字典)。显然,我可以遍历列表并比较如下所示的关键属性。
def get_dict_by_key(data):
for el in data:
if el['key'] == 2345435:
return el
return None
是否存在另一种方法(无需显式遍历列表)?是否有一些预定义的方法,例如list.index(element)
,可以在其中输入我要查找的字典的不完整信息?
答案 0 :(得分:1)
否,没有带有字典列表的预定义方法:您必须手动进行迭代。您可以通过next
和生成器表达式来实现:
mydict = next((x for x in data if x['key'] == 2345435), None)
但是您的功能已经足够,并且可能会更有效率。注意return None
是多余的,如果不满足return
,则假定为这个。
您正在寻找的O(1)时间索引功能可以通过重组数据来实现,例如通过键或使用自定义类建立索引的字典或词典。
如果您可以使用第三方库,则Pandas直接接受字典列表:
import pandas as pd
df = pd.DataFrame(data).set_index('key')
这给出了:
print(df)
data key2
key
5705435 data 1
2345435 data 1
9155435 data 2
访问索引标签会给出一系列映射:
print(df.loc[2345435])
data data
key2 1
Name: 2345435, dtype: object
答案 1 :(得分:1)
您可以编写一个生成器表达式。
>>> next((d for d in data if d.get('key') == 2345435), None)
{'data': 'data', 'key': 2345435, 'key2': 1}
我知道,标准库中没有特殊的过滤功能可以完成这项工作。在某种程度上必须有一个循环,因为您想对列表中的每个项目执行 操作(可能)。
答案 2 :(得分:1)
您可以使用内置的列表理解功能来内置all
。将所需的键存储在另一本词典中:
a = {'key': 5705435, 'key2': 1, 'data': 'data'}
b = {'key': 2345435, 'key2': 1, 'data': 'data'}
c = {'key': 9155435, 'key2': 2, 'data': 'data'}
data = [a,b,c]
criteria = { 'key' : 9155435, 'key2' : 2}
result = [x for x in data if all([value == x[key] for key,value in criteria.items()])]
这将仅返回字典c
,而以下内容将返回:
# returns a & b
criteria = { 'key2' : 1}
result = [x for x in data if all([value == x[key] for key,value in criteria.items()])]
# returns a, b & c
criteria = { 'data: 'data' }
result = [x for x in data if all([value == x[key] for key,value in criteria.items()])]