2009-04-16 3 views
11

Was ist die schönste Art der Spaltung dieser:Mehrere Tupel zu zwei Paar Tuple in Python?

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

in dieser:

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

Unter der Annahme, dass der Eingang immer eine gerade Anzahl von Werten hat.

+7

Sie können nicht auf eine Variable mit dem Namen Tupel wollen, wie es die eingebaute Funktion Tupel überschreibt(). – recursive

Antwort

36

zip() ist dein Freund:

t = ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h') 
zip(t[::2], t[1::2]) 
+0

Schöne Alternative! –

+1

+1, weil es hübsch ist und ich wusste nicht über die Syntax [::] –

+0

funktioniert nicht für Tupel = ('a', 'b', 'c', 'd', 'e', ​​'f ',' g ',' h ',' i ') # notieren Sie das letzte' i ', das macht die Tupel ungerade Länge – dfa

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

+1 explizitere Verwendung der Bereichsfunktion –

-1

Hier ist ein allgemeines Rezept für jede Größe Brocken, wenn es nicht immer 2 sein könnte:

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

chunks= chunk(tuples, 2) 

Oder, wenn Sie Iteratoren genießen :

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) 
+2

Ich denke, du meinst Bereich (0, len (Seq), n), anstatt Bereich (0, len (seq)) – Noah

+0

-1: funktioniert nicht. – nosklo

+0

Noah: ta, tatsächlich. – bobince

7

Oder wir ing itertools (die recipe für grouper sehen):

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

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

+1: für die Erwähnung der Dokumentation (Sie kamen zuerst :) – tzot

0

ich diesen Code präsentieren basierend auf Peter Hoffmann's answer als Antwort auf dfa's comment.

Es wird garantiert funktionieren, ob Ihr Tupel eine gerade Anzahl von Elementen hat oder nicht.

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

Die (len(tup)/2)*2 Bereichsparameter berechnet die höchste gerade Zahl kleiner oder gleich die Länge des Tupels so gewährleistet ist, zu arbeiten, ob das Tupel eine gerade Anzahl von Elementen hat.

Das Ergebnis der Methode wird eine Liste sein. Dies kann mit der Funktion tuple() in Tupel konvertiert werden.

Probe:

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) 

Ausgabe

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