两个列表的值的组合

时间:2013-07-29 07:59:42

标签: python combinations idiomatic

我正在寻找一种将n维向量(作为列表给出)与偏移列表相结合的惯用方法,该列表应应用于每个维度。 I.e。:鉴于我有以下值和偏移量:

v = [5, 6]
o = [-1, 2, 3]

我想获得以下列表:

n = [[4, 5], [7, 5], [8, 5], [4, 8], [7, 8], [8, 8], [4, 9], [7, 9], [8, 9]]

来自:

n = [[5-1, 6-1], [5+2, 6-1], [5+3, 6-1], [5-1, 6+2], [5+2, 6+2], [5+3, 6+2], [5-1, 6+3], [5+2, 6+3], [5+3, 6+3]]

此处的性能不是问题,结果列表的顺序也无关紧要。关于如何在没有丑陋的嵌套for循环的情况下生成这个的任何建议?我想itertools提供了解决方案的工具,但我还没弄明白。

4 个答案:

答案 0 :(得分:6)

from itertools import product    

[map(sum, zip(*[v, y])) for y in product(o, repeat=2)]

或者,正如falsetru和Dobi在评论中所建议的那样:

[map(sum, zip(v, y)) for y in product(o, repeat=len(v))]

答案 1 :(得分:2)

itertools.product()为您提供o所需的组合。使用列表推导来创建n

from itertools import product

n = [[v[0] + x, v[1] + y] for x, y in product(o, repeat=2)]

演示:

>>> [[v[0] + x, v[1] + y] for x, y in product(o, repeat=2)]
[[4, 5], [4, 8], [4, 9], [7, 5], [7, 8], [7, 9], [8, 5], [8, 8], [8, 9]]

答案 2 :(得分:2)

使用itertools.product:

>>> import itertools
>>> 
>>> v = [5, 6]
>>> o = [-1, 2, 3]
>>> 
>>> x, y = v
>>> [[x+dx, y+dy] for dx, dy in itertools.product(o, repeat=2)]
[[4, 5], [4, 8], [4, 9], [7, 5], [7, 8], [7, 9], [8, 5], [8, 8], [8, 9]]

来自:

[[5-1, 6-1], [5-1, 6+2], [5-1, 6+3], [5+2, 6-1], [5+2, 6+2], [5+2, 6+3], [5+3, 6-1], [5+3, 6+2], [5+3, 6+3]]

答案 3 :(得分:1)

您可以使用itertools模块获取所有排列。