2009-12-10 3 views
16

में tuples की सूची में tuple जोड़ें मैं पाइथन के लिए नया हूं और ऐसा करने का सबसे अच्छा तरीका नहीं जानता।पायथन

मेरे पास टुपल्स की एक सूची है जो अंक और अन्य सूची का प्रतिनिधित्व करती है जो ऑफ़सेट का प्रतिनिधित्व करती है। मुझे इस तरह के सभी संयोजनों का एक सेट चाहिए। यहाँ कुछ कोड है:

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

साइकिल, तो अंक के लिए ऑफसेट जोड़ने के नए tuples का निर्माण।

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

, मैं आलोक के जवाब की तरह। हालांकि, itertools के प्रशंसकों के लिए, itertools आधारित समकक्ष (अजगर 2.6 में और बाद में) है:

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

हालांकि, इस मामले में itertools समाधान सरल एक से नहीं तेजी से होता है (यह वास्तव में एक बालक है धीमे क्योंकि इसे प्रत्येक ऑफसेट के लिए बार-बार प्रत्येक x, y को अनपैक करने की आवश्यकता होती है, जबकि आलोक का सरल दृष्टिकोण प्रत्येक x, y को एक बार अनपैक करता है)। फिर भी, itertools.product अन्य मामलों में नेस्टेड लूप का एक उत्कृष्ट विकल्प है, इसलिए, इसके बारे में जानने के लायक है! -)

+0

यह भी ध्यान देने योग्य है कि संयोजक फ़ंक्शन itertools.product, itertools.permutations, और itertools.combinations हैं पायथन 2.6 में नया। – musicinmybrain

+0

ठीक है, किया गया है (हालांकि यह समझाने में बहुत मुश्किल हो जाता है कि पाइथन रिलीज प्रत्येक फीचर को प्रत्येक बार पेश किया गया था जब भी आप किसी भी पायथन सुविधा का जिक्र करते हैं, आपको पता है! -)। –