在字典中进行迭代..(双重迭代)Python

3
我有一个字典。
example: A = {1:'one',2:'two' , 3: 'three}

我想要的基本上就像是两个for循环的东西,这样我就可以得到以下的顺序。

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

基本上,当我们有一个循环内嵌在另一个循环中,导致的时间复杂度为O(n2)。 那么在Python字典中如何实现呢? 我很难弄清楚这个问题。

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

谢谢

3个回答

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

5
>>> 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
好的。我还要补充一点,如果顺序与示例中使用的相同,那么原帖作者应该注意对A.keys()进行排序,而不是输出的列表:它们将生成相同的顺序,但第一次调用将比后面的少排序更少的元素。 - mac
请纠正我,但他可以这样做 list(it.combinations(A.keys().sort(), 2)),对吗? - 2rs2ts
2
不应该使用 .sort(),而是应该使用 sorted(A.keys()),因为 .sort() 是原地排序,所以表达式将会评估为 ...nations(None, 2) - mac

1
如果您需要迭代所有键对,可以使用简单的for循环来完成:
>>> 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

编辑:

为避免重复列出同一对,您可以使用集合在迭代之前存储这些对:

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

嗨..这个可以工作..但是如果有1 2,那么我不想要2 1,所以基本上在x中迭代过的任何内容都应该在y中被排除..我该怎么做? - frazman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接