Unir pares de elementos de una lista – Python

Sé que se puede unir una lista para hacer una cadena larga como en:

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

Obviamente esto saldría:

 'abcd' 

Sin embargo, lo que estoy tratando de hacer es simplemente unirme a la primera y segunda cadenas de la lista, luego unirme a la tercera y cuarta y así sucesivamente. En resumen, a partir del ejemplo anterior en lugar de lograr una salida de:

 ['ab', 'cd'] 

¿Hay alguna manera simple de hacer esto? Probablemente también debería mencionar que las longitudes de las cadenas en la lista serán impredecibles, al igual que el número de cadenas dentro de la lista, aunque la cantidad de cadenas siempre será parejo. Así que la lista original podría ser:

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

Puedes usar la notación de corte con pasos:

 >>> 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 misma lógica se aplica a las listas también. La longitud de la cadena no importa, porque simplemente estás agregando dos cadenas juntas.

Utilice un iterador.

Lista de comprensión:

 >>> si = iter(['abcd', 'e', 'fg', 'hijklmn', 'opq', 'r']) >>> [c+next(si, '') for c in si] ['abcde', 'fghijklmn', 'opqr'] 
  • Muy eficiente para el uso de la memoria.
  • Exactamente una travesía de s

Expresión del generador:

 >>> 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  >>> list(pair_iter) ['abcde', 'fghijklmn', 'opqr'] 
  • utilizar como un iterador

Usando map, str .__ add__, iter

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

siguiente (iterador [, predeterminado]) está disponible a partir de Python 2.6

Solo para ser pythonic 🙂

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

en caso de que desee alarmarse si la longitud de la lista es impar puede intentar:

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

La mejor de las suertes

Sin construir listas temporales:

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

o:

 >>> import itertools >>> s = 'abcdefgh' >>> si = iter(s) >>> map(''.join, itertools.izip(si, si)) ['ab', 'cd', 'ef', 'gh'] 
 >>> 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'] 

Bueno, lo haría de esta manera ya que no soy bueno con Regs ..

CÓDIGO

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

salida:

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

Espero que esto ayude 🙂