2015-05-27 13 views
-3

如何访问字典变异:如何从同一个字段删除元素时有效循环字典

我有两个字典完全相同的副本。基于少数条件,我需要在循环中删除少量元素。删除发生,但字典迭代每个元素,我明白了为什么,但我想知道是否有任何可以做的事情来避免被删除的键的额外循环。

例如

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]  

当计算上述代码的输出I得到以下:

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

对于一个简单的开始,你的'if'语句是排他的,一个或都不正确,而不是两个,因此使用'elif'第二'if'。不会有太大的区别,但每一点都有帮助。 – cdarke

+0

您能否以简单的英语解释*您用这种算法试图完成什么?你有两组键/值对,你想要做什么? –

+3

你为什么连环?如果a.get(0,False)和b.get(3,False):del a [3]'会做同样的事情,没有循环。 – IanAuld

回答

1

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

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

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

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

if key in a: 
    del a[key]