删除超出界限的字典键(python)

时间:2018-02-25 01:25:30

标签: python loops dictionary

如果你有一个整数字典:

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

你想要:

  1. 验证密钥是否介于0到25之间。

  2. 删除范围之外的任何键,因为它们无效并且会破坏数据集。

  3. 字典键不是自然排序的。

    鉴于,如何验证您的密钥是否在所需范围内? 我的尝试:

    for x,y in d.items(): 
        if x<0 or x>25: 
             del d[x]
    

    跑步时我收到错误:

    RuntimeError: dictionary changed size during iteration 
    

    我将如何弥补这一点?

3 个答案:

答案 0 :(得分:4)

在您的示例中,您在循环播放时正在变异dThis 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]}