从数组值中过滤字典

Posted

技术标签:

【中文标题】从数组值中过滤字典【英文标题】:Filter dictionary from array values 【发布时间】:2019-03-31 14:22:02 【问题描述】:

我有一本字典,其值如下:

dictionary = (10,9): 1, (44,11): 2, (1,1): 99

基本上我的键是整数对,每个键的值都是整数。

我有一个存储一组键的数组:

array = [(1,1), (5,19), (58,7)]

我想过滤我的字典以仅包含键存储在数组中的元素。就我而言,过滤字典后,我将获得以下信息:

dictionary = (1,1): 99

因为存储在数组中的字典的唯一键是(1,1)

最有效的方法是什么?

【问题讨论】:

filter items in a python dictionary where keys contain a specific string的可能重复 【参考方案1】:

你可以这样做:

dictionary = (10,9): 1, (44,11): 2, (1,1): 99
array = [(1,1), (5,19), (58,7)]

result =  k:v for k, v in dictionary.items() if k in array

输出

(1, 1): 99

甚至更快,将列表转换为set:

s = set(array)
result = k: v for k, v in dictionary.items() if k in s

【讨论】:

【参考方案2】:

您可以找到字典键和数组元组的集合交集,然后在字典理解中获取新值。这将降低搜索数组中每个键的复杂性:

dictionary = (10,9): 1, (44,11): 2, (1,1): 99
array = [(1,1), (5,19), (58,7)]

>>> i:dictionary[i] for i in set(dictionary.keys()).intersection(array)
(1, 1): 99

【讨论】:

【参考方案3】:

这是一个dict-comprehension:

>>> dictionary = (10,9): 1, (44,11): 2, (1,1): 99
>>> lst = [(1,1), (5,19), (58,7)]    
>>> d = k:v for k,v in dictionary.items() if k in lst
>>> (1, 1): 99

我将array 重命名为lst,因为它是list。我们不应将列表与 numpy 数组、array.arraybytearray 类型混淆。

如果您还不习惯理解,也可以编写传统的 for 循环:

>>> d = 
>>> for key in dictionary:
...:    if key in lst:
...:        d[key] = dictionary[key]
...:        
>>> d
>>> (1, 1): 99

【讨论】:

【参考方案4】:

刚刚呢:

res = i: dictionary[i] for i in array if i in dictionary

这在 O(n) 中执行,其中 narray 中的项目数,并且不需要任何额外的数据结构。

对于您的dictionaryarray,这给了我们:

(1, 1): 99

【讨论】:

以上是关于从数组值中过滤字典的主要内容,如果未能解决你的问题,请参考以下文章

通过(例如:标题或描述)值中的关键字过滤多维数组(PHP)

通过在键和值中搜索部分匹配来过滤数组元素

从给定键值对的字典数组中过滤 NSDictionary

如果字典元素为空,如何过滤字典数组?

字典数组和字符串的过滤器数组

按匹配不同数组的属性过滤字典数组