我正在寻找一种将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提供了解决方案的工具,但我还没弄明白。
答案 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模块获取所有排列。