根据关于通缉的字典的不完整信息在字典列表中查找字典 [重复]

Posted

技术标签:

【中文标题】根据关于通缉的字典的不完整信息在字典列表中查找字典 [重复]【英文标题】:Find Dict in List of Dicts Based on Incomplete Information About Wanted Dict [duplicate] 【发布时间】:2019-04-25 03:28:56 【问题描述】:

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

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 的字典或返回 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),我可以在其中传递关于我正在寻找的字典的不完整信息

【问题讨论】:

没有秘密成分.. :) ***.com/questions/8653516/… @SarthakNegi,该目标问题与此问题之间存在(IMO,关键)差异,即此问题具有(可能是唯一的)key,它可以启用重组数据/ Pandas在 O(1) 时间内执行许多查询。 【参考方案1】:

不,没有带有字典列表的预定义方法:您必须手动迭代。您可以通过next 和生成器表达式来实现:

mydict = next((x for x in data if x['key'] == 2345435), None)

但是你的功能已经足够了,而且可能会更有效率。注意return None 是多余的,如果不满足return,则假定这是多余的。

您正在寻找的 O(1) 时间索引功能可以通过重组数据来实现,例如按键或使用自定义类索引的一个或多个字典。

如果您可以使用 3rd 方库,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

【讨论】:

【参考方案2】:

你可以写一个生成器表达式。

>>> next((d for d  in data if d.get('key') == 2345435), None)
'data': 'data', 'key': 2345435, 'key2': 1

据我所知,标准库中没有特殊的过滤功能可以完成这项工作。在某种程度上,必须有一个循环,因为您想对列表中的每个项目(可能)执行 for 操作。

【讨论】:

【参考方案3】:

您可以使用带有嵌套列表理解的内置 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()])]

【讨论】:

以上是关于根据关于通缉的字典的不完整信息在字典列表中查找字典 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用字典查找替换列表中的元素

使用 Pandas 从查找字典中重命名多索引行

哈希表——swift字典的实现原理

在字典列表中查找重复值

在字典中查找重复列表并打印重复列表的键

列表中嵌套字典,根据字典的值排序