从数组值中过滤字典
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.array
或 bytearray
类型混淆。
如果您还不习惯理解,也可以编写传统的 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) 中执行,其中 n 是 array
中的项目数,并且不需要任何额外的数据结构。
对于您的dictionary
和array
,这给了我们:
(1, 1): 99
【讨论】:
以上是关于从数组值中过滤字典的主要内容,如果未能解决你的问题,请参考以下文章