Python 如何迭代字典中的每对项

Python 如何迭代字典中的每对项,python,arrays,dictionary,Python,Arrays,Dictionary,我正在做一个重力模拟器,我需要计算作用在每个物体上的合力 为了做到这一点,我需要遍历字典(id:instance of Body class)中的每一对物体,并获得这两个物体之间的引力。然后,我把所有的力加起来,得到结果 但是,如何在Python中仅对字典中的每对项迭代一次?如果天体被列在一个列表中,那就很简单: for i in range(len(bodies)): for j in range(len(bodies) - i - 1): k = j - i + 1

我正在做一个重力模拟器,我需要计算作用在每个物体上的合力

为了做到这一点,我需要遍历字典
(id:instance of Body class)
中的每一对物体,并获得这两个物体之间的引力。然后,我把所有的力加起来,得到结果

但是,如何在Python中仅对字典中的每对项迭代一次?如果天体被列在一个列表中,那就很简单:

for i in range(len(bodies)):
    for j in range(len(bodies) - i - 1):
        k = j - i + 1
        b1 = bodies[i]
        b2 = bodies[k]

您正在查找
itertools.compositions()

例如:

In [76]: lis=['a','b','c','d']  #consider these as your dictionary items

In [77]: [x for x in combinations(lis,2)]
Out[77]: [('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]
itertools
”非常适合此用例

from itertools import combinations
for a, b in combinations(bodies.values(), 2):
    print a, b
该模块提供了一种优秀的组合方法,您可以使用:

from itertools import combinations

bodies = {}
# add bodies

for a,b in combinations(bodies.values(), 2):
    # a and b are a pair of bodies. do stuff
    pass
顺便说一句,即使您使用以下列表,这仍然有效:

from itertools import combinations

bodies = []
# add bodies

for a,b in combinations(bodies, 2):
    pass

注意:如果您想要支持大量实体;您可以使用而不是
O(n*n)
。请参阅“编程珍珠”一书中的讨论。