2012-04-03 17 views
1

Ich habe eine Liste wieListe Slicing Python

myl = ['A','B','C','D','E','F'] #length always even 

Nun meine gewünschte Ausgabe ist 'AB','CD','EF'

I

versucht
>>> myl = ['A','B','C','D','E','F'] 
>>> even_pos = myl[::2] 
>>> odd_pos = myl[::-2] 
>>> odd_pos.reverse() 
>>> newlist = zip(even_pos,odd_pos) 
>>> for x in newlist: 
...  print "".join(list(x)) 
... 
... 
AB 
CD 
EF 
>>> 

Ich mag diese Art und Weise nicht, weil ich denke, das ist auch viel.

Also, gibt es einen besseren Weg, um meine Ausgabe zu erreichen.

+3

möglich Duplikat [? Wie kann man in gleichmäßig große Stücke in Python eine Liste aufgeteilt] (http://stackoverflow.com/questions/312443/how-do -you-split-a-list-in-every-size-chunks-in-python) – bernie

Antwort

4

Sie können dies prägnant eine Liste Verständnis oder Generator unter Verwendung des Ausdrucks:

>>> myl = ['A','B','C','D','E','F'] 
>>> [''.join(myl[i:i+2]) for i in range(0, len(myl), 2)] 
['AB', 'CD', 'EF'] 
>>> print '\n'.join(''.join(myl[i:i+2]) for i in range(0, len(myl), 2)) 
AB 
CD 
EF 

Sie ''.join(myl[i:i+2]) mit myl[i] + myl[i+1] für diesen speziellen Fall ersetzen könnte, wobei jedoch die ''.join() Methode ist einfacher, wenn Sie Gruppen tun wollen von drei oder mehr.

Oder eine Alternative, die für zip() aus der Dokumentation kommt:

>>> map(''.join, zip(*[iter(myl)]*2)) 
['AB', 'CD', 'EF'] 
1

Wie wäre das?

3

Warum ist Ihre Methode so kompliziert? Sie tun können, im Grunde, was Sie getan haben, aber in einer Linie, etwa so:

[ "".join(t) for t in zip(myl[::2], myl[1::2]) ] 

F.J Antwort obwohl effizienter ist.

+1

Seine Methode ist so kompliziert, weil er höchstwahrscheinlich nicht über List Comprehensions weiß, also mache ich ihm keine Vorwürfe. – jdi

+0

@jdi: Ja, ich wusste nicht über 'listen comprehensions' und nachdem ich dann' mind = blown' gesehen habe – RanRag

+0

@jdi: Ich rede eigentlich davon, 'myl [:: - 2]' zu nehmen und es umzukehren, um bekomme die ungeraden Positionen .. – cha0site

1

Ich würde wahrscheinlich schreiben:

[myl[i] + myl[i + 1] for i in xrange(len(myl), step=2)] 
+1

Ich würde String-Verkettung vermeiden, indem Sie sie zusammenfügen. Verwenden Sie die Join- oder String-Formatierung. Aufgrund des expliziten x + 1-Index wird dies auch dann unterbrochen, wenn die Größe der Liste nicht gerade ist. – jdi

+0

Ich glaube nicht, dass es einen Grund gibt, String-Verkettungen mit '+' zu vermeiden, wenn Sie nur zwei Strings hinzufügen. Es wird nicht zu einem quadratischen Verhalten führen und könnte sogar ein bisschen schneller sein. Und das OP garantiert, dass die Länge gerade ist. – Taymon

+0

Aber er hat nicht garantiert, dass die Größe der Liste nicht 10k sein konnte. String-Verkettung mit + ist langsam. Selbst Guido sagt, es zu vermeiden :-) – jdi