【问题标题】:Delete dictionary keys that are out of bounds (python)删除超出范围的字典键(python)
【发布时间】:2018-02-25 01:25:30
【问题描述】:

如果你有一个整数字典:

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. 删除任何超出范围的键,因为它们无效并且会破坏数据集。

字典键不是自然排序的。

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

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

运行时出现错误:

RuntimeError: dictionary changed size during iteration 

我将如何弥补这一点?

【问题讨论】:

    标签: python loops dictionary


    【解决方案1】:

    在您的示例中,您在循环遍历 d 时对其进行了变异。 This is bad.

    如果您不需要更改原始 d,最简单的方法是使用字典推导

    d = {k: v for k, v in d.items() if 0 <= k <= 25}
    

    【讨论】:

    • 你不是说 d.items() 吗?
    • @TheClonerx 是的,我刚刚意识到:P
    【解决方案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]}
    

    正如其他人所表明的那样,重建新词典始终是解决此问题的简单方法。

    您可以在这里使用基本的 dict 理解:

    {k: d[k] for k in d if 0 <= k <= 25}
    

    甚至是filter() 的函数式方法:

    dict(filter(lambda x: 0 <= x[0] <= 25, d.items()))
    

    【讨论】:

      【解决方案3】:

      您可以使用字典理解:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-08-17
        • 1970-01-01
        • 1970-01-01
        • 2014-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-25
        相关资源
        最近更新 更多