Pary z jednej listy

| | | | | |

Często znalazłem potrzebę przetworzenia listy parami. Zastanawiałem się, który byłby to pytoniczny i wydajny sposób, i znalazłem to w Google:

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

Myślałem, że to wystarczająco pythonic, ale po niedawnej dyskusji z udziałem idiomy a wydajność, postanowiłem przeprowadzić kilka testów:

 importuj czas z 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,Brak,Brak,2), islice(t,1,Brak,2)) A = range(10000) B = xrange(len(A )) def pairs_4(t): # ignoruj wartość 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: # czas parowania s = time.time() for i in range(1000): p = f(A) t1 = time.time() - s # time używając par s = time.time() for dzwonię e(1000): p = f(A) dla a, b w p: pass t2 = time.time() - s print t1, t2, t2-t1 

To były wyniki na moim komputerze:

1.48668909073 2.63187503815 1.14518594742 0.105381965637 1.35109519958 1.24571323395 0.00257992744446 1.46182489395 1.45924496651 0.00251388549805 1.70076990128 1.69825601578  implementacja list, indeksowanie list i ich dzielenie w Pythonie jest bardzo wydajne. Jest to wynik zarówno pocieszający, jak i nieoczekiwany.

Czy istnieje inny, „lepszy” sposób poruszania się po liście parami?

Zauważ, że jeśli lista ma nieparzystą liczbę elementów, to ostatni nie będzie w żadnej parze.

Jaki byłby właściwy sposób na zapewnienie, że wszystkie elementy są uwzględnione?

Dodałem te dwie sugestie z odpowiedzi do testów:

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

Oto wyniki:

0.00159502029419 1.25745987892 1.25586485863 0.00222492218018 1.23795199394 1.23572707176 

Jak dotąd wyniki

Najbardziej pytonowa i bardzo wydajna:

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

Najbardziej wydajny i bardzo pythoniczny:

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

Chwilę zajęło mi zorientowanie się, że pierwsza odpowiedź używa dwóch iteratorów, podczas gdy druga używa pojedynczą.

Aby poradzić sobie z sekwencjami o nieparzystej liczbie elementów, zasugerowano rozszerzenie oryginalnej sekwencji o jeden element (None), który zostanie sparowany z poprzednim ostatni element, coś, co można osiągnąć za pomocą itertools.izip_longest().

Wreszcie

Zauważ, że w Pythonie 3.x, zip () zachowuje się jak itertools.izip(), a itertools.izip() znika.

Mamy nadzieję, że ten artykuł pomógł Ci rozwiązać problem. Oprócz Pary z jednej listy sprawdź inne tematy związane z exp.

Chcesz się wyróżniać w Pythonie? Zobacz naszą recenzję najlepszych kursów online Pythona 2022. Jeśli interesujesz się Data Science, sprawdź także, jak nauczyć się programowania w R.

Nawiasem mówiąc, ten materiał jest również dostępny w innych językach:



Jan Williams

New York | 2022-11-29

islice to wszystko jest trochę zagmatwane 😭 Pary z jednej listy to nie jedyny problem jaki napotkałam. Sprawdzane wczoraj, działa!

Davies Robinson

Rome | 2022-11-29

mean to wszystko jest trochę zagmatwane 😭 Pary z jednej listy to nie jedyny problem jaki napotkałam. Mam tylko nadzieję, że już się nie pojawi

Walter Danburry

Warsaw | 2022-11-29

Prosto i przejrzyście. Dziękuję za podzielenie się. Pary z jednej listy i inne sprawy z StackOverflow zawsze były moim słabym punktem 😁.. Wrócimy jutro z informacją zwrotną

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