我是python的新手,并不知道最好的方法.
我有一个表示点的元组列表和另一个表示偏移的列表.我需要一组这种形式的所有组合.这是一些代码:
offsets = [( 0, 0),( 0,-1),( 0, 1),( 1, 0),(-1, 0)]
points = [( 1, 5),( 3, 3),( 8, 7)]
Run Code Online (Sandbox Code Playgroud)
所以我的组合点应该是
[( 1, 5),( 1, 4),( 1, 6),( 2, 5),( 0, 5),
( 3, 3),( 3, 2),( 3, 4),( 4, 3),( 2, 3),
( 8, 7),( 8, 6),( 8, 8),( 9, 7),( 7, 7)]
Run Code Online (Sandbox Code Playgroud)
我无法使用NumPy或任何其他库.
Alo*_*hal 33
result = [(x+dx, y+dy) for x,y in points for dx,dy in offsets]
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅列表推导.
小智 15
很简单:
>>> rslt = []
>>> for x, y in points:
... for dx, dy in offsets:
... rslt.append( (x+dx, y+dy) )
...
>>> rslt
[(1, 5), (1, 4), (1, 6), (2, 5), (0, 5), (3, 3), (3, 2), (3, 4), (4, 3), (2, 3), (8, 7), (8, 6), (8, 8), (9, 7), (7, 7)]
Run Code Online (Sandbox Code Playgroud)
循环通过点和偏移,然后构建新的元组,将偏移添加到点.
就个人而言,我喜欢Alok的回答.但是,对于itertools的粉丝来说,基于itertools的等价物(在Python 2.6及更高版本中)是:
import itertools as it
ps = [(x+dx, y+dy) for (x, y), (dx, dy) in it.product(points, offsets)]
Run Code Online (Sandbox Code Playgroud)
然而,在这种情况下,itertools解决方案并不比简单的解决方案快(它实际上有点慢,因为它需要x, y
为每个偏移重复解包每个,而Alok的简单方法解包每个x, y
但只有一次).尽管如此,在其他情况下,itertools.product是嵌套循环的绝佳替代品,因此,值得了解它! - )
如果您不关心结果中的重复项:
result = []
for ox, oy in offsets:
for px, py in points:
result.append((px + ox, py + oy))
Run Code Online (Sandbox Code Playgroud)
如果您关心结果中的重复项:
result = set()
for ox, oy in offsets:
for px, py in points:
result.add((px + ox, py + oy))
Run Code Online (Sandbox Code Playgroud)