如何在删除元素时有效地循环遍历字典(变异)

时间:2015-05-27 12:33:36

标签: python dictionary

如何访问变异词典:

我有两个字典完全相互复制。基于几个条件,我要求在循环期间删除少量元素。删除发生但字典迭代每个元素,我明白为什么,但我想知道是否有任何可以做的事情来避免删除键的额外循环。

例如

a={0:{1,2,3}, 1:{2,3,4}, 2:{6,7,8}, 3:{3,4,5}, 4:{7,8,9}}
b={0:{1,2,3}, 1:{2,3,4}, 2:{6,7,8}, 3:{3,4,5}, 4:{7,8,9}}

for key, values in a.items():
    print key ,  a
    for key2, values2 in b.items():
        if key==0 and key2==3:
            del a[3]
        if key==1 and key2==2:
            del a[2]    

当计算上述代码的输出时,我得到以下内容:

0 {0: set([1, 2, 3]), 1: set([2, 3, 4]), 2: set([8, 6, 7]), 3: set([3, 4, 5]), 4: set([8, 9, 7])}
1 {0: set([1, 2, 3]), 1: set([2, 3, 4]), 2: set([8, 6, 7]), 4: set([8, 9, 7])}
2 {0: set([1, 2, 3]), 1: set([2, 3, 4]), 4: set([8, 9, 7])}
3 {0: set([1, 2, 3]), 1: set([2, 3, 4]), 4: set([8, 9, 7])}
4 {0: set([1, 2, 3]), 1: set([2, 3, 4]), 4: set([8, 9, 7])}

对于我在循环中删除的2和3的所有行都进行了迭代。

我想要的输出有点类似于

0 {0: set([1, 2, 3]), 1: set([2, 3, 4]), 2: set([8, 6, 7]), 3: set([3, 4, 5]), 4: set([8, 9, 7])}
1 {0: set([1, 2, 3]), 1: set([2, 3, 4]), 2: set([8, 6, 7]), 4: set([8, 9, 7])}
4 {0: set([1, 2, 3]), 1: set([2, 3, 4]), 4: set([8, 9, 7])}

我如何使用字典,我想使用字典,因为字典中删除的平均情况复杂度是o(1)其中列表中的相同是o(n)......

由于我的数据集太大,我需要一种优化的方法。

提前致谢

1 个答案:

答案 0 :(得分:1)

循环时,无法更改字典大小。当你使用:

for key, values in a.items():
    ...

a.items()list格式返回[(key1, value1), (key2, value2).....]。所以你没有在字典上进行交流。  这就是为什么即使你删除字典元素a.items()仍然得到它,你输出相同。

回答你关于有效地做这件事的问题:在字典上迭代你不能。但是,如果您确定要删除的key。然后你可以简单地使用:

if key in a:
    del a[key]
相关问题