如果你有一个整数字典:
d = {
1:[0],
2:[1],
3:[0,1,2,3,4],
4:[0],
5:[1],
6:[0,1,2,3,4],
11:[0],
22:[1],
33:[0,1,2,3,4],
44:[0],
55:[1],
66:[0,1,2,3,4]
}
你想要:
验证密钥是否介于0到25之间。
删除范围之外的任何键,因为它们无效并且会破坏数据集。
字典键不是自然排序的。
鉴于,如何验证您的密钥是否在所需范围内? 我的尝试:
for x,y in d.items():
if x<0 or x>25:
del d[x]
跑步时我收到错误:
RuntimeError: dictionary changed size during iteration
我将如何弥补这一点?
答案 0 :(得分:4)
在您的示例中,您在循环播放时正在变异d
。 This is bad.
如果您不需要更改原始d
,最简单的方法是使用词典理解:
d = {k: v for k, v in d.items() if 0 <= k <= 25}
答案 1 :(得分:2)
如果你想在迭代时删除键,你需要迭代一个副本,然后弹出不符合你条件的键:
d = {1:[0], 2:[1], 3:[0,1,2,3,4], 4:[0], 5:[1], 6:[0,1,2,3,4], 11:[0], 22:[1], 33:[0,1,2,3,4], 44:[0], 55:[1], 66:[0,1,2,3,4]}
for k in d.copy(): # or list(d)
if not 0 <= k <= 25:
d.pop(k) # or del d[k]
哪个输出:
{1: [0], 2: [1], 3: [0, 1, 2, 3, 4], 4: [0], 5: [1], 6: [0, 1, 2, 3, 4], 11: [0], 22: [1]}
正如其他人所表明的那样,重建新词典总是一种简单的方法。
你可以在这里使用基本的词典理解:
{k: d[k] for k in d if 0 <= k <= 25}
甚至是filter()
的功能性方法:
dict(filter(lambda x: 0 <= x[0] <= 25, d.items()))
答案 2 :(得分:1)
您可以使用词典理解:
d = { 1:[0], 2:[1], 3:[0,1,2,3,4], 4:[0], 5:[1], 6:[0,1,2,3,4], 11:[0], 22:[1], 33:[0,1,2,3,4], 44:[0], 55:[1], 66:[0,1,2,3,4] }
new_d = {a:b for a, b in d.items() if a <= 25 and a >= 0}
输出:
{1: [0], 2: [1], 3: [0, 1, 2, 3, 4], 4: [0], 5: [1], 6: [0, 1, 2, 3, 4], 11: [0], 22: [1]}