从python字典中删除某些前缀的键的有效方法

时间:2015-06-01 05:52:02

标签: python python-2.7 dictionary

我有一个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

6 个答案:

答案 0 :(得分:6)

由于其他答案都使用dict理解来创建一个新的dict并且保持原始的dict不受影响,我将给出一个改变dict的地方:

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

有更好的方法吗?

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

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

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

答案 1 :(得分:2)

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

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'}

答案 2 :(得分:1)

使用字典理解

{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'}

答案 3 :(得分:1)

>>> 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'}

答案 4 :(得分:1)

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

答案 5 :(得分:1)

尝试这个。

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