根据想要的词典的不完整信息在词典列表中查找词典

时间:2018-11-22 12:30:32

标签: python list dictionary

假设一个字典列表,例如:

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),可以在其中输入我要查找的字典的不完整信息

3 个答案:

答案 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()])]