3

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

为了做到这一点,我需要遍历字典中的每一对物体(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]
4

3 回答 3

2

values()itertools'combinations非常适合这个用例。

from itertools import combinations
for a, b in combinations(bodies.values(), 2):
    print a, b
于 2012-10-27T19:41:59.807 回答
1

您正在寻找itertools.combinations()

一个例子:

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')]
于 2012-10-27T19:40:33.983 回答
1

itertools模块提供了一个很好的combinations方法,您可以使用:

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
于 2012-10-27T19:42:46.150 回答