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']
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.
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']
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']
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
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
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']
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 :)
>>> 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']