unir - eliminar varios elementos de una lista python
Unir pares de elementos de una lista-Python (6)
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 :)
Sé que se puede unir una lista para hacer una cadena larga como en:
x = [''a'', ''b'', ''c'', ''d'']
print ''''.join(x)
Obviamente esto daría como resultado:
''abcd''
Sin embargo, lo que estoy tratando de hacer es simplemente unir las cadenas primera y segunda de la lista, luego unirme a la tercera y cuarta, y así sucesivamente. En resumen, a partir del ejemplo anterior, en cambio, logra 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 el número de cadenas siempre será par. Entonces la lista original podría ser:
[''abcd'', ''e'', ''fg'', ''hijklmn'', ''opq'', ''r'']
Puede usar la notación de sectores con los 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 cuerda no importa, porque simplemente estás agregando dos cuerdas.
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'']
Use 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 memoria.
- Exactamente un recorrido 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
<generator object at 0x4ccaa8>
>>> list(pair_iter)
[''abcde'', ''fghijklmn'', ''opqr'']
- usar 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 comenzando en Python 2.6
solo ser pitónico :-)
>>> 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
>>> 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'']