【问题标题】:Efficient way of removing keys of certain prefix from python dictionary从python字典中删除某些前缀键的有效方法
【发布时间】:2015-06-01 05:52:01
【问题描述】:

我有一个看起来像这样的 python 字典;

{'Prefix_1':'12', 'Prefix_2':'11', 'Prefix_3':'14', '1':'241', '2':'312', '3':'421'
}

我想删除键以“前缀”开头的键值对。结果应该是一个看起来像这样的字典;

{'1':'241', '2':'312', '3':'421'
}

我目前这样做的方法是使用del dictionary['Prefix_X'] 逐一删除每一对。有哪些更有效的方法?

我正在使用 python 2.7

【问题讨论】:

  • 你能改变数据结构,或者它是如何构建的吗?例如,如果您有 {'Prefix_': {'1': '12', ...}, ...},这将变得微不足道。
  • 如果输出字典保持不变,这也很好。
  • 那么就这样做吧:这样会更有效率,因为您只需要删除一个键,尽管显然需要提前做一些额外的工作。
  • 实际字典比问题中的字典大得多。还有很多要删除的键。
  • 所以?字典越大越好,避免对其进行迭代。

标签: python python-2.7 dictionary


【解决方案1】:

由于其他答案都使用字典理解来创建一个新的字典并保持原始字典不变,我将给出一个更改字典的答案:

for k in d.keys():
    if k.startswith('Prefix'):
        d.pop(k)

有没有更好的办法?

假设字典中有 N 个键,要查找具有给定前缀的所有键,您必须遍历所有键,这是 O(N) 时间复杂度。

然后你需要一个一个地删除它们,最坏的情况是它们都带有给定的前缀,所以这也是 O(N) 时间复杂度。

O(N) 的总时间复杂度。

【讨论】:

  • 似乎这比 dict comp 快两倍多。只要 OP 不介意改变 dict 这就是要走的路。
  • 在python 3中可能会导致RuntimeError: dictionary changed size during iteration,请改用for k in list(d.keys()):
【解决方案2】:

您可以对原始字典使用 dict 理解:

D = {'Prefix_1':'12', 'Prefix_2':'11', 'Prefix_3':'14', '1':'241', '2':'312', '3':'421'

NewDict = {k: D[k] for k in D if not k.startswith('Prefix')}
NewDict
{'2': '312', '3': '421', '1': '241'}

【讨论】:

    【解决方案3】:

    使用字典推导

    {k:v for k, v in d.items() if not k.startswith('Prefix')}
    

    In [44]: {k:v for k, v in d.items() if not k.startswith('Prefix')}
    Out[44]: {'1': '241', '2': '312', '3': '421'}
    

    【讨论】:

      【解决方案4】:
      >>> z = {'Prefix_1':'12', 'Prefix_2':'11', 'Prefix_3':'14', '1':'241', '2':'312', '3':'421'}
      >>> {k:v for k,v in z.items() if not k.startswith('Prefix')}
      {'1': '241', '3': '421', '2': '312'}
      

      【讨论】:

        【解决方案5】:
        d1 = {'Prefix_1':'12', 'Prefix_2':'11', 'Prefix_3':'14', '1':'241', '2':'312', '3':'421'}
        d2 = {k: v for k, v in d1.iteritems() if not k.startswith('Prefix')}
        
        print d1
        print d2
        

        【讨论】:

          【解决方案6】:

          试试这个。

          for key in d.keys():
              if 'Prefix' in key:
                  d.pop(key)
          

          【讨论】:

          • 如果单词'Prefix'不是前缀,这将弹出dict条目。例如123Prefix
          猜你喜欢
          • 2011-02-17
          • 1970-01-01
          • 2021-02-23
          • 1970-01-01
          • 1970-01-01
          • 2012-08-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多