从数组值中过滤字典

3

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

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

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

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

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

我希望将我的字典过滤,只包含那些键存储在数组中的元素。在我的情况下,过滤字典后我将获得以下结果:
dictionary = {(1,1): 99}

由于存储在数组中的字典的唯一键是(1,1),那么最有效的方法是什么?


可能是在Python字典中过滤包含特定字符串的键的项的重复问题。 - Bill the Lizard
4个回答

6
您可以像这样做:
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}

甚至更快的方法是,将列表转换为一个集合

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

1
你可以找到字典键和数组元组的交集,然后在字典推导式中获取新值。这将减少在数组中搜索每个键的复杂度:
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}

0
这是一个字典推导式:
>>> 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}

0

只是这样怎么样:

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

这个算法的时间复杂度为 O(n),其中 narray 中元素的数量,不需要任何额外的数据结构。

对于你的 dictionaryarray,这个算法可以这样实现:

{(1, 1): 99}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接