web-dev-qa-db-fra.com

Joindre des paires d’éléments d’une liste - Python

Je sais qu'une liste peut être jointe pour former une longue chaîne comme dans:

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

Évidemment, cela produirait:

'abcd'

Cependant, ce que j'essaie de faire est simplement de joindre les première et deuxième chaînes de la liste, puis de joindre les troisième et quatrième et ainsi de suite. En bref, à partir de l'exemple ci-dessus, obtenez plutôt un résultat de:

['ab', 'cd']

Y at-il un moyen simple de faire cela? Je devrais probablement aussi mentionner que les longueurs des chaînes de la liste seront imprévisibles, de même que le nombre de chaînes de la liste, même si le nombre de chaînes sera toujours pair. Donc, la liste originale pourrait tout aussi bien être:

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

Vous pouvez utiliser la notation slice avec les étapes suivantes:

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

La même logique s'applique aux listes à. La longueur de la chaîne n'a pas d'importance, car vous ajoutez simplement deux chaînes ensemble.

73
utdemir

Utilisez un itérateur.

Compréhension de liste:

>>> si = iter(['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r'])
>>> [c+next(si, '') for c in si]
['abcde', 'fghijklmn', 'opqr']
  • Très efficace pour l'utilisation de la mémoire.
  • Exactement une traversée de s

Expression du générateur:

>>> 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']
  • utiliser comme itérateur

Utilisation de map, str .__ add__, iter

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

next (iterator [ default]) est disponible à partir de Python 2.6

32
kevpie

juste pour être pythonique :-)

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

au cas où vous souhaiteriez être alarmé si la longueur de la liste est impair, vous pouvez essayer:

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

Bonne chance

4
mahmoh

Sans construire des listes temporaires:

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

ou:

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

Eh bien, je le ferais de cette façon car je ne suis pas bon avec Regs ..

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

sortie:

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

J'espère que cela t'aides :)

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