2011-12-08 81 views
3

我有一本字典迭代字典中的..(双迭代)蟒蛇

example: A = {1:'one',2:'two' , 3: 'three} 

所以我想基本上是像一个2环之类的东西.. 这样我就可以得到以下顺序..

# 1 2 
# 1 3 
# 2 3 
... and so on if more elements are there 

所以基本上是O(n2)的操作..在这里我们有一个循环withing循环 我们如何在Python字典实现这一目标。 我有一个很难搞清楚了这一点..

for key in A.keys(): 
     # how do i Access all the other keys.. 
      # do something 

感谢

回答

4
>>> import itertools as it 
>>> A = {1:'one', 2:'two', 3: 'three'} 
>>> list(it.combinations(A.keys(), 2)) 
[(1, 2), (1, 3), (2, 3)] 
+1

我只是潜伏着,我看到了这一点,我只是想引用iterator.combinations()的文档...“组合按字典顺序排列,因此,如果输入迭代被排序,组合元组将被生成按排序顺序“。因此OP应该注意确保他的输入符合他的要求。 – 2rs2ts

+0

没错。我还要补充一点,如果顺序是例子中使用的顺序,OP应该注意对'A.keys()'而不是输出列表进行排序:它们会生成相同的顺序,但第一次调用将会有以排序远远少于后者的元素。 – mac

+0

纠正我,如果我错了,但他可以做'list(it.combinations(A.keys()。sort(),2))'right? – 2rs2ts

5
>>> import itertools 
>>> list(itertools.combinations([1, 2, 3], 2)) 
[(1, 2), (1, 3), (2, 3)] 
1

如果您需要遍历所有对键,你可以用简单的做它的循环:

>>> d={1:'one',2:'two',3:'three'} 
>>> for (x,y) in ((x,y) for x in d for y in d if x!=y): 
...  print x,y 

编辑:

要避免两次列出同一对,您可以使用一组来存储pa IRS之前你迭代:

>>> for (x,y) in set(((min(x,y),max(x,y)) for x in d for y in d if x!=y)): 
...  print x,y 

但这是有点笨拙,如图dstromberg的答案,我会建议使用itertools.combinations

+0

HI ..这工程..但如果有1 2的话,我不想2 1所以基本上任何已经反复在x应被排除在y中..我如何做到这一点 – Fraz

+0

@Fraz:更新了我的答案。 – MAK