2012-10-27 100 views
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] 
+2

注:

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 

順便說一句,如果你使用的列表,這將仍然工作,即使你想支持大量的機構;你可以使用['O(n * log n)'算法](http://en.wikipedia.org/wiki/N-body_simulation#Calculation_optimizations)而不是'O(n * n)'。請參閱「編程珍珠」一書中的討論。 – jfs

回答

2

values()itertools'combinations是理想對於這個用例。

from itertools import combinations 
for a, b in combinations(bodies.values(), 2): 
    print a, b 
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')] 
1

itertools模塊提供了一個極好的combinations方法,你可以使用:

from itertools import combinations 

bodies = [] 
# add bodies 

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