【问题标题】: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)

最有效的方法是什么?

【问题讨论】:

标签: python arrays dictionary filter


【解决方案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}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-04
          • 2021-12-15
          • 1970-01-01
          • 2018-06-13
          • 1970-01-01
          • 2017-03-27
          • 1970-01-01
          • 2017-07-21
          相关资源
          最近更新 更多