85 votes

Jointure d'éléments d'une liste - Python

Je suis assez nouveau dans python (quelques semaines) et ont rencontré un problème se joindre à une liste. Maintenant, je sais que d'une liste peuvent être réunis pour faire une longue chaîne comme dans:

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

Évidemment, ce serait sortie:

    'abcd'

Cependant, ce que je suis en train de faire est de simplement adhérer à la première et deuxième chaînes dans la liste, puis participer à la troisième et à la quatrième, et ainsi de suite. En bref, à partir de l'exemple ci-dessus, au lieu d'atteindre une puissance de:

    ['ab', 'cd']

Est-il un moyen simple de faire cela? Je devrais aussi mentionner que les longueurs des chaînes de la liste sont imprévisibles, comme le nombre dans la liste, bien que le nombre de chaînes sera toujours le même. Si la liste initiale, pourrait tout aussi bien être:

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

ou que ce soit. De toute façon, toute aide serait grandement apprécié merci à l'avance. :)

80voto

utdemir Points 9107

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 aussi aux listes. La longueur de la chaîne n'a pas d'importance, car vous ajoutez simplement deux chaînes ensemble.

41voto

kevpie Points 5243

L'utilisation d'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

Générateur d'expression:

>>> 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']
  • utilisez-le comme un itérateur

À l'aide de la carte, str._ajoutez_, iter

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

prochaine(itérateur [par défaut]) est disponible à partir de la version 2.6 de Python

2voto

pillmuncher Points 4726

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

1voto

Andreas Jung Points 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']

1voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X