1

我正在寻找一种惯用的方法来将 n 维向量(以列表形式给出)与偏移量列表结合起来,这将应用于每个维度。即:鉴于我有以下值和偏移量:

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

4 回答 4

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))]
于 2013-07-29T08:07:08.297 回答
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]]
于 2013-07-29T08:05:48.880 回答
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]]
于 2013-07-29T08:05:56.537 回答
1

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

于 2013-07-29T08:05:40.650 回答