如何在字典中迭代每个键值对

3
我正在制作一个重力模拟器,需要计算每个物体受到的合力。为了做到这一点,我需要遍历字典中每对物体(id: Body类实例),并获取这两个物体之间的引力。然后,我将累加所有力并得出结果。但是,在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
注意:如果你想支持大量的物体,可以使用O(n * log n)算法代替O(n * n)。请参考《编程珠玑》一书中的讨论。 - jfs
3个回答

2

values()方法和itertoolscombinations函数是处理这种情况的理想工具。

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

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