2009-12-10 21 views
16

私はPythonには新しく、これを実行する最良の方法はわかりません。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のか、他のライブラリを使用することはできませんよ。

答えて

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

詳細については、list comprehensionsを参照してください。

14

非常にシンプル:ポイントとオフセットによる

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

サイクル、その後、ポイントにオフセットを追加する新しいタプルを構築します。

4

あなたは結果で重複を気にしない場合:

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)) 
8

を個人的に、私はAlokの答えが好きです。しかし、itertoolsのファンのために、(Pythonの2.6以降で)itertoolsをベースと同等です:

import itertools as it 
ps = [(x+dx, y+dy) for (x, y), (dx, dy) in it.product(points, offsets)] 

ただし、この場合にはitertoolsソリューションは、単純なもの(それは実際には少しだよりない高速ですAlokのシンプルなアプローチは各x, yを解凍していますが、1度はオフセットごとにそれぞれx, yを解凍する必要があるため、遅くなります)。それでも、itertools.productは他のケースではネストされたループの優れた代替品なので、それについて知る価値があります! - )

+0

コンビナトリアル関数itertools.product、itertools.permutations、およびitertools.combinationsは次のとおりですPython 2.6の新機能です。 – musicinmybrain

+0

OK、完了しました(それぞれのフィーチャーが導入されたPythonのリリースを説明するのは非常に面倒ですが、Pythonのフィーチャーについて言及するたびに説明します)。 –

関連する問題