从数组值过滤字典

时间:2018-10-26 19:31:50

标签: python arrays dictionary filter

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

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

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

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

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

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

dictionary = {(1,1): 99}

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

最有效的方法是什么?

4 个答案:

答案 0 :(得分:4)

您可以执行以下操作:

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}

答案 1 :(得分:1)

您可以找到字典键和数组元组的已设置交集,然后在dict理解中获取新值。这样可以减少搜索数组中每个键的复杂性:

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}

答案 2 :(得分: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}

答案 3 :(得分:0)

那又怎么样:

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

这是在 O(n)中完成的,其中 n array中的项数,不需要任何其他数据结构。

对于您的dictionaryarray,这给我们:

{(1, 1): 99}