在修改字典后如何删除字典中的所有元素? 如果第二个被更改,那么我们将删除它后面的所有内容;如果第一个被更改,则我们将删除它后面的所有内容,依此类推。
d = {'first': 'one', 'second': 'two', 'third': 'three'}
k = 'second'
for key in d:
if k in key:
d[key] = 'new value'
# delete third
答案 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)