18

私はpythonが初めてで、これを行う最善の方法がわかりません。

ポイントを表すタプルのリストと、オフセットを表す別のリストがあります。これが形成するすべての組み合わせのセットが必要です。ここにいくつかのコードがあります:

offsets = [( 0, 0),( 0,-1),( 0, 1),( 1, 0),(-1, 0)]
points = [( 1, 5),( 3, 3),( 8, 7)]

したがって、結合されたポイントの私のセットは

[( 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)]

NumPy やその他のライブラリを使用できません。

4

4 に答える 4

33
result = [(x+dx, y+dy) for x,y in points for dx,dy in offsets]

詳細については、リスト内包表記を参照してください。

于 2009-12-10T03:37:00.537 に答える
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)]

ポイントとオフセットを循環し、ポイントにオフセットを追加する新しいタプルを構築します。

于 2009-12-10T03:35:49.743 に答える
8

個人的には、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)]

ただし、この場合、 itertools ソリューションは単純なソリューションよりも高速ではありませんx, y( Alok の単純なアプローチでは各オフセットを 1 回ずつアンパックするのに対し、オフセットごとに繰り返しアンパックする必要があるため、実際には少し遅くなりますx, y)。それでも、 itertools.product はネストされたループの優れた代替手段なので、知っておく価値があります!-)

于 2009-12-10T05:42:35.743 に答える
5

結果の重複を気にしない場合:

result = []
for ox, oy in offsets:
    for px, py in points:
        result.append((px + ox, py + oy))

結果の重複を気にする場合:

result = set()
for ox, oy in offsets:
    for px, py in points:
        result.add((px + ox, py + oy))
于 2009-12-10T03:39:31.073 に答える