it-swarm.com.de

Verbinden von Elementenpaaren einer Liste - Python

Ich weiß, dass eine Liste zu einer langen Zeichenfolge verbunden werden kann, wie in:

x = ['a', 'b', 'c', 'd']
print ''.join(x)

Offensichtlich würde dies Folgendes ausgeben:

'abcd'

Ich versuche jedoch, einfach die erste und die zweite Zeichenfolge in der Liste und dann die dritte und die vierte Zeichenfolge usw. zusammenzufügen. Kurz gesagt, erzielen Sie aus dem obigen Beispiel stattdessen eine Ausgabe von:

['ab', 'cd']

Gibt es eine einfache Möglichkeit, dies zu tun? Ich sollte wahrscheinlich auch erwähnen, dass die Länge der Zeichenfolgen in der Liste nicht vorhersehbar ist, ebenso wie die Anzahl der Zeichenfolgen in der Liste, obwohl die Anzahl der Zeichenfolgen immer gerade sein wird. Die ursprüngliche Liste könnte also genauso gut sein:

['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r'] 
79
John

Sie können die Slice-Notation mit folgenden Schritten verwenden:

>>> x = "abcdefghijklm"
>>> x[0::2] #0. 2. 4...
'acegikm'
>>> x[1::2] #1. 3. 5 ..
'bdfhjl'
>>> [i+j for i,j in Zip(x[::2], x[1::2])] # Zip makes (0,1),(2,3) ...
['ab', 'cd', 'ef', 'gh', 'ij', 'kl']

Gleiche Logik gilt auch für Listen. Die Saitenlänge spielt keine Rolle, da Sie einfach zwei Saiten zusammenfügen.

73
utdemir

Verwenden Sie einen Iterator.

Listenverständnis:

>>> si = iter(['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r'])
>>> [c+next(si, '') for c in si]
['abcde', 'fghijklmn', 'opqr']
  • Sehr effizient für die Speichernutzung.
  • Genau eine Durchquerung von s

Generatorausdruck:

>>> si = iter(['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r'])
>>> pair_iter = (c+next(si, '') for c in si)
>>> pair_iter # can be used in a for loop
<generator object at 0x4ccaa8>
>>> list(pair_iter) 
['abcde', 'fghijklmn', 'opqr']
  • als Iterator verwenden

Mit map, str .__ add__, iter

>>> si = iter(['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r'])
>>> map(str.__add__, si, si)
['abcde', 'fghijklmn', 'opqr']

next (iterator [ default]) ist ab Python 2.6 verfügbar

32
kevpie

nur um pythonisch zu sein :-)

>>> x = ['a1sd','23df','aaa','ccc','rrrr', 'ssss', 'e', '']
>>> [x[i] + x[i+1] for i in range(0,len(x),2)]
['a1sd23df', 'aaaccc', 'rrrrssss', 'e']

falls Sie alarmiert werden möchten, wenn die Listenlänge ungerade ist, können Sie Folgendes versuchen:

[x[i] + x[i+1] if not len(x) %2 else 'odd index' for i in range(0,len(x),2)]

Viel Glück

4
mahmoh

Ohne temporäre Listen zu erstellen:

>>> import itertools
>>> s = 'abcdefgh'
>>> si = iter(s)
>>> [''.join(each) for each in itertools.izip(si, si)]
['ab', 'cd', 'ef', 'gh']

oder:

>>> import itertools
>>> s = 'abcdefgh'
>>> si = iter(s)
>>> map(''.join, itertools.izip(si, si))
['ab', 'cd', 'ef', 'gh']
2
pillmuncher

Nun, ich würde es so machen, da ich nicht gut mit Regs bin.

CODE

t = '1. eat, food\n\
7am\n\
2. brush, teeth\n\
8am\n\
3. crack, eggs\n\
1pm'.splitlines()

print [i+j for i,j in Zip(t[::2],t[1::2])]

Ausgabe:

['1. eat, food   7am', '2. brush, teeth   8am', '3. crack, eggs   1pm']  

Hoffe das hilft :)

1
>>> lst =  ['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r'] 
>>> print [lst[2*i]+lst[2*i+1] for i in range(len(lst)/2)]
['abcde', 'fghijklmn', 'opqr']
1
Andreas Jung