Pares de uma única lista

| | | | | |

Muitas vezes, encontrei a necessidade de processar uma lista por pares. Eu queria saber qual seria a maneira pythônica e eficiente de fazer isso e encontrei isso no Google:

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

Achei que era pythonic o suficiente, mas depois de uma discussão recente envolvendo idiomas versus eficiência, decidi fazer alguns testes:

 import time from 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,Nenhum,Nenhum,2), islice(t,1,Nenhum,2)) A = range(10000) B = xrange(len(A) )) def pairs_4(t): # ignora o valor de t! t = B return izip(islice(t,None,None,2), islice(t,1,None,2)) for f in pairs_1, pairs_2, pairs_3 , pairs_4: # cronometra o emparelhamento s = time.time() para i in range(1000): p = f(A) t1 = time.time() - s # time usando os pares s = time.time() for eu toquei e(1000): p = f(A) for a, b in p: pass t2 = time.time() - s print t1, t2, t2-t1 

Esses foram os resultados no meu computador:

  1,48668909073 2,63187503815 1,14518594742 0,105381965637 1,35109519958 1,24571323395 0,00257992744446 1,46182489395 1,45924496651 0,00251388549805 1,70076990128 1,69825601578  

Se I "m interpretá-los corretamente, que deve significar que a implementação de listas, indexação de listas e fatiamento de listas em Python é muito eficiente. É um resultado ao mesmo tempo reconfortante e inesperado.

Existe outra maneira "melhor" de percorrer uma lista em pares?

Observe que, se a lista tem um número ímpar de elementos, então o último não estará em nenhum dos pares.

Qual seria a maneira correta de garantir que todos os elementos sejam incluídos?

Adicionei estas duas sugestões das respostas aos testes:

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

Estes são os resultados:

0.00159502029419 1.25745987892 1.25586485863 0.00222492218018 1.23795199394 1.23572707176 

Resultados até agora

Mais pythonic e muito eficiente:

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

Mais eficiente e muito pythonic:

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

Levei um momento para entender que a primeira resposta usa dois iteradores enquanto a segunda usa um único.

Para lidar com sequências com número ímpar de elementos, a sugestão foi aumentar a sequência original adicionando um elemento (Nenhum) que fica emparelhado com o anterior último elemento, algo que pode ser alcançado com itertools.izip_longest().

Finalmente

Observe que, em Python 3.x, zip () se comporta como itertools.izip(), e itertools.izip() desapareceu.

Esperamos que este artigo tenha ajudado você a resolver o problema. Além de Pares de uma única lista, confira outros tópicos relacionados a exp.

Quer se destacar em Python? Veja nossa análise dosmelhores cursos on-line de Python 2022. Se você estiver interessado em Ciência de Dados, veja também como aprender programação em R.

A propósito, este material também está disponível em outros idiomas:



Anna Emmerson

Abu Dhabi | 2022-11-29

sin está tudo um pouco confuso 😭 Pares de uma única lista não é o único problema que eu encontrei. Vou usá-lo na minha tese de bacharelado

Olivia Richtgofen

Massachussetts | 2022-11-29

Obrigado por explicar! Eu fiquei preso com Pares de uma única lista por algumas horas, finalmente consegui fazer isso 🤗. Só não tenho certeza se é o melhor método

Jan Chamberlet

Moscow | 2022-11-29

De forma simples e clara. Obrigado por compartilhar. Pares de uma única lista e outras questões com median sempre foi meu ponto fraco 😁. Retornarei amanhã com feedback

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