从for循环中的dict中删除元素

时间:2020-01-20 17:51:57

标签: python

在修改字典后如何删除字典中的所有元素? 如果第二个被更改,那么我们将删除它后面的所有内容;如果第一个被更改,则我们将删除它后面的所有内容,依此类推。

d = {'first': 'one', 'second': 'two', 'third': 'three'}
k = 'second'

for key in d:
    if k in key:
        d[key] = 'new value'
        # delete third

4 个答案:

答案 0 :(得分:2)

创建一个新字典,而不是删除元素。 由于字典没有排序,因此您应该以某种方式对项目进行排序。

d = {'first': 'one', 'second': 'two', 'third': 'three'}
k = 'second'

new_d = {}
for key, value in sorted(d.items()):
    if key == k:
        new_d[key] = 'new value'
        break
    new_d[key] = value

答案 1 :(得分:1)

您可以使用以下代码。它将字典项目放入列表中,并从其余项目创建新字典:

d = {'first': 'one', 'second': 'two', 'third': 'three'}
k = 'second'
d[k] = 'NewValue'
d = dict(list(d.items())[:list(d.keys()).index(k)+1])
print(d)

出局:

{'first': 'one', 'second': 'NewValue'}

出于好奇,我将其与@Daniel的回答进行计时,这是我的timeit代码和结果:

import timeit, functools

def test_1(d,k):
    d = dict(list(d.items())[:list(d.keys()).index(k)+1])
    d[k] = 'new vlaue'
    return d

def test_2(d, k):
    new_d = {}
    for key, value in sorted(d.items()):
        if key == k:
            new_d[key] = 'new value'
            break
        new_d[key] = value
    return new_d


if __name__ == '__main__':
    keys = [x for x in range(100000)]
    values = [x for x in range(100000)]

    d = dict(zip(keys, values))
    k = 9999
    a = timeit.timeit(functools.partial(test_1, d, k), number = 1000)
    b = timeit.timeit(functools.partial(test_2, d, k), number = 1000)
    print(a, b)

输出:

5.107241655999815 6.745305094000059

如果您在丹尼尔斯中将sorted(...)更改为list(...),则相反:

5.046288972999946 4.211456709999993

这是一个常数偏移量,可能是由于从dict两次创建列表而不是一次。因此,@ Daniels的答案既快速又节省了内存开销

答案 2 :(得分:0)

您可以通过键删除其余的字典。如下所示:

d = {'first': 'one', 'second': 'two', 'third': 'three'}
k = 'first' #for modify

keys = ['second', 'third'] #rest of dict to delete

list(map(d.pop, keys))

它将返回{'first':'modified_value'}

答案 3 :(得分:0)

如果要使它们保持顺序,则不应使用普通词典,至少在当然低于py3.7的情况下。

如果您低于3.7,请使用

我们在下面的代码中创建了一个新字典,并删除了旧字典,您甚至可以将其放入函数中并使用它。

from collections import OrderedDict

d =OrderedDict([('first','one'), ('second', 'two'), ('third', 'three')])
k = 'second'

output_dict = OrderedDict()
for key,value in d.items():
    if k in key:
        output_dict[key] = value
        break
    else:
        output_dict[key] = value
del d
print(output_dict)