我正在制作一个重力模拟器,我需要计算作用在每个身体上的合力。
为了做到这一点,我需要遍历字典(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]
答案 0 :(得分:2)
values()
和itertools
' combinations
是此用例的理想选择。
from itertools import combinations
for a, b in combinations(bodies.values(), 2):
print a, b
答案 1 :(得分: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')]
答案 2 :(得分: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