2009-04-16 3 views
11

इसे विभाजित करने का सबसे अच्छा तरीका क्या है:पाइथन में दो-जोड़े टुपल के लिए एकाधिक टुपल?

tuple = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h') 

इसमें:

tuples = [('a', 'b'), ('c', 'd'), ('e', 'f'), ('g', 'h')] 

मानते हैं कि इनपुट में हमेशा मूल्यों की संख्या भी होती है।

+7

आप एक चर टपल नामित करने के लिए नहीं चाहते हो सकता है के रूप में यह अधिलेखित कर देता है builtin समारोह टपल()। – recursive

उत्तर

36

zip() अपने दोस्त है :

def iterchunk(iterable, n): 
    it= iter(iterable) 
    while True: 
     chunk= [] 
     try: 
      for i in range(n): 
       chunk.append(it.next()) 
     except StopIteration: 
      break 
     finally: 
      if len(chunk)!=0: 
       yield tuple(chunk) 
+0

का अधिक स्पष्ट उपयोग अच्छा विकल्प! –

+1

+1 क्योंकि यह सुंदर है और मुझे [::] वाक्यविन्यास –

+0

के बारे में पता नहीं था tuple = ('a', 'b', 'c', 'd', 'e', ​​'f' के लिए काम नहीं करता है ',' g ',' h ',' i ') # अंतिम' i 'नोट करें, जो tuples odd-length – dfa

15
[(tuple[a], tuple[a+1]) for a in range(0,len(tuple),2)] 
+0

+1 रेंज फ़ंक्शन –

-1

यहाँ हिस्सा किसी भी आकार के लिए एक सामान्य नुस्खा है, अगर यह हमेशा 2 हो नहीं हो सकता है:

def chunk(seq, n): 
    return [seq[i:i+n] for i in range(0, len(seq), n)] 

chunks= chunk(tuples, 2) 

या, यदि आप iterators का आनंद

+2

मुझे लगता है कि आप रेंज (0, लेन (सीईसी)) के बजाय श्रेणी (0, लेन (सीईसी), एन) का मतलब है – Noah

+0

-1: काम नहीं करता है। – nosklo

+0

नूह: टा, वास्तव में। – bobince

7

या, हम itertools ing (grouper के लिए recipe देखें):

from itertools import izip 
def group2(iterable): 
    args = [iter(iterable)] * 2 
    return izip(*args) 

tuples = [ab for ab in group2(tuple)] 
+0

+1: दस्तावेज़ीकरण का उल्लेख करने के लिए (आप पहले आए थे :) – tzot

0

मैं dfa's comment के लिए एक प्रतिक्रिया के रूप में इस कोड Peter Hoffmann's answer के आधार पर प्रस्तुत करते हैं।

यह काम करने की गारंटी है कि आपके ट्यूपल में तत्वों की संख्या भी है या नहीं। तो यह क्या है या नहीं टपल तत्वों की एक भी नंबर है काम करने के लिए गारंटी है

[(tup[i], tup[i+1]) for i in range(0, (len(tup)/2)*2, 2)] 

(len(tup)/2)*2 रेंज पैरामीटर टपल की लंबाई के उच्चतम सम संख्या कम या बराबर गणना करता है।

विधि का परिणाम एक सूची होने जा रहा है। इसे tuple() फ़ंक्शन का उपयोग करके tuples में परिवर्तित किया जा सकता है।

नमूना:

def inPairs(tup): 
    return [(tup[i], tup[i+1]) for i in range(0, (len(tup)/2)*2, 2)] 

# odd number of elements 
print("Odd Set") 
odd = range(5) 
print(odd) 
po = inPairs(odd) 
print(po) 

# even number of elements 
print("Even Set") 
even = range(4) 
print(even) 
pe = inPairs(even) 
print(pe) 

आउटपुट

 
Odd Set 
[0, 1, 2, 3, 4] 
[(0, 1), (2, 3)] 
Even Set 
[0, 1, 2, 3] 
[(0, 1), (2, 3)]