kzen.dev
  • Otázky
  • Značky
  • Používatelia
Oznámenia
Odmeny
Registrácia
Po registrácii budete informovaní o odpovediach a komentároch na vaše otázky.
Prihlásiť sa
Ak už máte konto, prihláste sa a skontrolujte nové oznámenia.
Za pridané otázky, odpovede a komentáre budú udelené odmeny.
Viac na
Zdroj
Upraviť
Nathan Fellman
Nathan Fellman
Question

Ako paralelne iterovať cez dva zoznamy?

Mám dve iterable v jazyku Python a chcem ich prebrať po dvojiciach:

foo = (1, 2, 3)
bar = (4, 5, 6)

for (f, b) in some_iterator(foo, bar):
    print "f: ", f, "; b: ", b

Výsledkom by malo byť:

f: 1; b: 4
f: 2; b: 5
f: 3; b: 6

Jedným spôsobom je iterácia cez indexy:

for i in xrange(len(foo)):
    print "f: ", foo[i], "; b: ", b[i]

Ale to sa mi zdá trochu nepythonické. Existuje lepší spôsob, ako to urobiť?

758 2009-11-02T21:26:24+00:00 3
 ivanleoncz
ivanleoncz
Edited question 3 september 2019 в 3:44
Programovanie
python
list
iterator
for-loop
This question has 1 odpoveď in English, to read them log in to your account.
Solution / Answer
 unutbu
unutbu
2 november 2009 в 9:28
2009-11-02T21:28:27+00:00
Viac na
Zdroj
Upraviť
#9646574

Python 3

for f, b in zip(foo, bar):
    print(f, b)

zip sa zastaví, keď sa zastaví kratšie z foo alebo bar.

V Pythone 3 je zip vráti iterátor tuplov, podobne ako itertools.izip v Pythone 2. Ak chcete získať zoznam tuplov, použite list(zip(foo, bar)). A na zipovanie, kým oba iterátory nie sú vyčerpané, použijete príkaz itertools.zip_longest.

Python 2

V Pythone 2 sa používa zip vráti zoznam kôpok. To je v poriadku, keď foo a bar nie sú masívne. Ak sú obe masívne, potom je vytvorenie zip(foo,bar) zbytočne masívne dočasná premenná a mala by sa nahradiť premennou itertools.izip alebo itertools.izip_longest, ktoré namiesto zoznamu vrátia iterátor.

import itertools
for f,b in itertools.izip(foo,bar):
    print(f,b)
for f,b in itertools.izip_longest(foo,bar):
    print(f,b)

izip sa zastaví, keď sa vyčerpá buď foo alebo bar. izip_longest sa zastaví, keď sa vyčerpá foo aj bar. Keď sú kratšie iterátory vyčerpané, izip_longest poskytne tuple s None na pozícii zodpovedajúcej danému iterátoru. Ak chcete, môžete okrem hodnoty None nastaviť aj inú hodnotu fillvalue. Pozri tu celý príbeh.


Všimnite si tiež, že zip a jeho príbuzný zip môžu ako argumenty prijímať ľubovoľný počet iterabilít. Napríklad,

for num, cheese, color in zip([1,2,3], ['manchego', 'stilton', 'brie'], 
                              ['red', 'blue', 'green']):
    print('{} {} {}'.format(num, color, cheese))

vypíše

1 red manchego
2 blue stilton
3 green brie
Tobias Kolb
Tobias Kolb
Edited answer 9 jún 2019 в 8:46
1188
0
Artificial intelligence to parse product page
productapi.dev
Karl Guertin
Karl Guertin
2 november 2009 в 9:27
2009-11-02T21:27:53+00:00
Viac na
Zdroj
Upraviť
#9646573

Chcete použiť funkciu zip.

for (f,b) in zip(foo, bar):
    print "f: ", f ,"; b: ", b
53
0
Artificial intelligence to parse product page
productapi.dev
Vlad Bezden
Vlad Bezden
23 apríl 2017 в 11:09
2017-04-23T11:09:20+00:00
Viac na
Zdroj
Upraviť
#9646575

Mali by ste použiť funkciu 'zip'. Tu je príklad, ako môže vyzerať vaša vlastná funkcia zip

def custom_zip(seq1, seq2):
    it1 = iter(seq1)
    it2 = iter(seq2)
    while True:
        yield next(it1), next(it2)
12
0
Pridať otázku
Kategórie
Všetky
Technológia
Kultúra / Rekreácia
Život / Umenie
Veda
Profesionálne
Obchod
Používatelia
Všetky
New
Popular
1
Анна Литвиненко
Registered pred dňom
2
Inessa bu
Registered pred mesiacom
3
Denis Babushkin
Registered pred mesiacom
4
asakuno asakuno
Registered pred mesiacom
5
aldo salerno
Registered pred mesiacom
Artificial intelligence to parse product page
productapi.dev
BG
DE
EL
ES
FR
ID
IT
JA
KO
NL
NO
PT
RO
RU
SK
TR
ZH
© kzen.dev 2023
Zdroj
stackoverflow.com
na základe licencie cc by-sa 3.0 s uvedením autora