Pares de lista única

| | | | | |

Con bastante frecuencia, he encontrado la necesidad de procesar una lista por pares. Me preguntaba cuál sería la forma pitónica y eficiente de hacerlo, y encontré esto en Google:

 pairs = zip(t[::2], t[1::2]) 

Pensé que era lo suficientemente pitónico, pero después de una discusión reciente que involucró a modismos versus eficiencia, decidí hacer algunas pruebas:

 tiempo de importación desde itertools import islice, izip def pairs_1(t): return zip(t[::2], t[1::2]) def pairs_2(t): return izip(t[::2], t[ 1::2]) def pairs_3(t): return izip(islice(t,Ninguno,Ninguno,2), islice(t,1,Ninguno,2)) A = range(10000) B = xrange(len(A )) def pairs_4(t): # ignorar el valor de t! , pares_4: # cronometrar el emparejamiento s = tiempo.tiempo() para i en el rango (1000): p = f(A) t1 = tiempo.tiempo() - s # tiempo usando los pares s = tiempo.tiempo() para yo en sonó e(1000): p = f(A) for a, b in p: pass t2 = time.time() - s print t1, t2, t2-t1 

Estos fueron los resultados en mi equipo:

  1.48668909073 2.63187503815 1.14518594742 ,105381965637 1.35109519958 1.24571323395 ,00257992744446 1.46182489395 1.45924496651 ,00251388549805 1.70076990128 1.69825601578  

Si I "m interpretarlos correctamente, que debería significar que la implementación de listas, indexación de listas y división de listas en Python es muy eficiente. Es un resultado tanto reconfortante como inesperado.

¿Hay otra forma "mejor" de recorrer una lista en pares?

Tenga en cuenta que si la lista tiene un número impar de elementos, entonces el último no estará en ninguno de los pares.

¿Cuál sería la forma correcta de asegurarse de que todos los elementos estén incluidos?

Agregué estas dos sugerencias de las respuestas a las pruebas:

def pairwise(t): it = iter(t) return izip(it, it) def chunkwise(t, size=2): it = iter(t) return izip(*[it]*size) 

Estos son los resultados:

0.00159502029419 1.25745987892 1.25586485863 0.00222492218018 1.23795199394 1.23572707176 

Resultados hasta ahora

Más pitónico y muy eficiente:

pairs = izip(t[::2] , t[1::2]) 

Más eficiente y muy pitónico:

pairs = izip(*[iter(t)]*2) 

Me tomó un momento asimilar que la primera respuesta usa dos iteradores mientras que la segunda usa uno solo.

Para tratar secuencias con un número impar de elementos, la sugerencia ha sido aumentar la secuencia original agregando un elemento (Ninguno) que se empareja con el anterior último elemento, algo que se puede lograr con itertools.izip_longest().

Finalmente

Tenga en cuenta que, en Python 3.x, zip () se comporta como itertools.izip(), y itertools.izip() desaparece.

Esperamos que este artículo le haya ayudado a resolver el problema. Además de Pares de lista única, consulta otros temas relacionados con exp.

¿Quiere sobresalir en Python? Consulte nuestra reseña de los mejores cursos en línea de Python 2022. Si está interesado en Data Science, consulte también cómo aprender programación en R.

Por cierto, este material también está disponible en otros idiomas:



Cornwall Innsbruck

Milan | 2022-11-29

Me estaba preparando para mi entrevista de codificación, gracias por aclarar esto - Pares de lista única en Python no es el más simple. Lo usare en mi tesis de licenciatura

Angelo Williams

New York | 2022-11-29

Me estaba preparando para mi entrevista de codificación, gracias por aclarar esto - Pares de lista única en Python no es el más simple. Comprobado ayer, ¡funciona!

Julia Lehnman

Berlin | 2022-11-29

Gracias por la explicación. Estuve atascado con el Pares de lista única durante algunas horas, finalmente lo conseguí 🤗. Volveré mañana con comentarios

Shop

Learn programming in R: courses

$

Best Python online courses for 2022

$

Best laptop for Fortnite

$

Best laptop for Excel

$

Best laptop for Solidworks

$

Best laptop for Roblox

$

Best computer for crypto mining

$

Best laptop for Sims 4

$

Latest questions

NUMPYNUMPY

Common xlabel/ylabel for matplotlib subplots

12 answers

NUMPYNUMPY

How to specify multiple return types using type-hints

12 answers

NUMPYNUMPY

Why do I get "Pickle - EOFError: Ran out of input" reading an empty file?

12 answers

NUMPYNUMPY

Flake8: Ignore specific warning for entire file

12 answers

NUMPYNUMPY

glob exclude pattern

12 answers

NUMPYNUMPY

How to avoid HTTP error 429 (Too Many Requests) python

12 answers

NUMPYNUMPY

Python CSV error: line contains NULL byte

12 answers

NUMPYNUMPY

csv.Error: iterator should return strings, not bytes

12 answers

News


Wiki

Python | How to copy data from one Excel sheet to another

Common xlabel/ylabel for matplotlib subplots

Check if one list is a subset of another in Python

sin

How to specify multiple return types using type-hints

exp

Printing words vertically in Python

exp

Python Extract words from a given string

Cyclic redundancy check in Python

Finding mean, median, mode in Python without libraries

cos

Python add suffix / add prefix to strings in a list

Why do I get "Pickle - EOFError: Ran out of input" reading an empty file?

Python - Move item to the end of the list

Python - Print list vertically