为什么没有它。删除已经在python dicts中实现了?

时间:2014-08-05 02:19:13

标签: python dictionary hash set

iter.remove()目前是否在python dicts中实现了?

让我们说我需要删除集合/字典中大约一半的元素。然后我被迫:

  1. 复制整个集/字典(n空格,n次)
  2. 遍历副本以查找要删除的元素,将其从原始字典中删除(n / 2加上n / 2个不同的查找)
  3. 或者:

    1. 迭代字典,添加元素以移除到新集合(n空格,n次)
    2. 迭代新集,从原始字典中删除每个元素(n / 2加n / 2次查找)
    3. 渐渐地,一切都仍然是“O(n)”时间,与实际相关的理智方式相比,这是非常低效的,大约慢3倍:

      1. 迭代dict,删除你不想要的东西。这真的是时间,而且是O(1)空间。
      2. 至少在散列集的常见实现下,作为链表的桶,迭代器应该能够通过简单地删除链表中的节点来删除它刚访问的元素而不进行新的查找。

        更重要的是,糟糕的解决方案还需要O(n)空间,即使对于那些倾向于在python中忽略这些优化问题的人来说也是如此。

1 个答案:

答案 0 :(得分:0)

还有另一种方法:

for key in list(mydict.keys()):
    val = mydict[key]
    if <decide drop>(val):
        mydict.pop(key)

可以解释为:

  1. 复制原始字典的键
  2. 通过单独查找迭代字典
  3. 在需要时删除元素
  4. 我怀疑与简单的迭代相比,invidual查找的开销会过高。但是,我很好奇(还没有测试过)。