Python

2009-12-10 11 views
16

'deki tuple listesine tuple ekle python'da yeniyim ve bunu yapmanın en iyi yolunu bilmiyorum.Python

Puanları temsil eden bir tuple listesi ve ofsetleri temsil eden başka bir liste var. Bu formların oluşturduğu tüm kombinasyonlara ihtiyacım var. İşte bazı kod:

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

Yani kombine noktaları benim set ben numpy ya da başka kütüphaneleri kullanmak mümkün değilim

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

olmalıdır.

cevap

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

Daha fazla bilgi için, bkz. list comprehensions.

14

Oldukça basit: noktaları ve uzaklıklar boyunca

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

Döngüsü, daha sonra noktalarına uzaklıklar ekleyerek yeni dizilerini kurmak.

4

Eğer sonuç kopyalarla ilgili önemsemiyorsan:

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

Eğer sonuç kopyalarla ilgili care yoksa:

result = set() 
for ox, oy in offsets: 
    for px, py in points: 
     result.add((px + ox, py + oy)) 
8

Şahsen, Alok yanıtını gibi. Ancak, itertools hayranları için, itertools tabanlı eşdeğer (Python 2.6 ve üstü) 'dir:

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

Ancak bu durumda itertools çözüm basit olandan değil hızlıdır (aslında biraz var daha yavaş, her bir x, y'u her ofset için tekrar tekrar açmak gerektiğinden, Alok'un basit yaklaşımı her x, y paketini bir kez daha açar). Yine de, itertools.product diğer durumlarda iç içe döngüler için mükemmel bir alternatiftir, bu yüzden, bu konuda bilmeye değer! -)

+0

Ayrıca, itertools.product, itertools.permutations ve itertools.combinations işlevlerinin birleştirici işlevlerinin olduğunu da belirtmek gerekir. Python'da yeni 2.6. – musicinmybrain

+0

Tamam, tamamlandı (her ne kadar Python'un her özelliği yayınladığını açıklamak çok yorucu olsa da, her Python özelliğinden bahsettiğiniz her zaman, biliyorsunuz!). –