समानांतर में दो सूचियों के माध्यम से पुनरावृति कैसे करें?


861

मेरे पास पायथन में दो पुनरावृत्तियाँ हैं, और मैं उनके साथ जोड़े में जाना चाहता हूँ:

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

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

इसका परिणाम यह होना चाहिए:

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

इसे करने का एक तरीका सूचकांकों पर चलना है:

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

लेकिन यह मुझे कुछ हद तक असहनीय लगता है। इसे करने का कोई बेहतर तरीका है?

जवाबों:


1349

अजगर ३

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

zipजब छोटा fooया barबंद हो जाता है।

में अजगर 3 , zip tuples के पुनरावर्तक, जैसे रिटर्न itertools.izipको Python2 में। टुपल्स की एक सूची प्राप्त करने के लिए, का उपयोग करें list(zip(foo, bar))। और जब तक दोनों पुनरावृत्तियाँ समाप्त नहीं हो जाती हैं, तब तक ज़िप करें, आप itertools.zip_longest का उपयोग करेंगे

अजगर २

में अजगर 2 , zip tuples की एक सूची देता है। यह ठीक है जब fooऔरbar बड़े पैमाने पर नहीं हैं। यदि वे दोनों बड़े पैमाने पर हैं, तो गठन zip(foo,bar)एक अनावश्यक रूप से बड़े पैमाने पर अस्थायी चर है, और इसके द्वारा प्रतिस्थापित किया जाना चाहिए itertools.izipया itertools.izip_longest, जो सूची के बजाय एक पुनरावृत्त लौटाता है।

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)

izipfooया तो barसमाप्त हो जाता है या समाप्त हो जाता है। izip_longestदोनों रुक जाते हैं fooऔर barथक जाते हैं। जब छोटे itter (s) समाप्त हो जाते हैं, izip_longestतो एक tuple पैदावार करता हैNone उस पुनरावृत्ति के अनुरूप स्थिति के करता है। तुम भी एक अलग सेट कर सकते हैं fillvalueके अलावा Noneयदि आप चाहें तो। पूरी कहानी के लिए यहाँ देखें ।


उस पर भी ध्यान दें zip और इसके zipसमान प्रकार के ब्रेथेन्स मनमानी संख्या को पुनरावृत्तियों के रूप में स्वीकार कर सकते हैं। उदाहरण के लिए,

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

प्रिंट

1 red manchego
2 blue stilton
3 green brie

@unutbu मैं ओपी के तरीके को izipएक से अधिक क्यों पसंद करूंगा (भले ही izip/ zipबहुत क्लीनर दिखता हो)?
आर्मंडल

3
आप शायद पहले पायथन 3 का उल्लेख करना चाहते हैं, क्योंकि यह संभवतः अधिक भविष्य का सबूत है। इसके अलावा, यह इंगित करने के लायक है कि पायथन 3 में, ज़िप () का ठीक यही फायदा है कि पायथन 2 में केवल itertools.izip () था और इस तरह यह आमतौर पर जाने का रास्ता है।
डैनियल एस।

3
क्या मैं आपसे अपने उत्तर को स्पष्ट रूप से अपडेट करने के लिए कह सकता हूं zipऔर किसी भी संख्या के पुनरावृत्तियों zipको itertoolsस्वीकार करने के लिए और केवल 2 को ही नहीं? यह प्रश्न अब विहित है और आपका उत्तर अद्यतन करने के लिए एकमात्र योग्य है।
तिजोरी

क्या होगा अगर इसके अलावा मैं सूचकांक iचाहते हैं? क्या मैं उस जिप को एन्युमरेट में लपेट सकता हूं?
चार्ली पार्कर

2
@CharlieParker: हाँ आप कर सकते हैं, लेकिन तब आप उपयोग करेंगे for i, (f, b) in enumerate(zip(foo, bar))
अनटुब


15

आपको ' जिप ' फंक्शन का इस्तेमाल करना चाहिए । यहां एक उदाहरण है कि आपका अपना ज़िप फ़ंक्शन कैसा दिख सकता है

def custom_zip(seq1, seq2):
    it1 = iter(seq1)
    it2 = iter(seq2)
    while True:
        yield next(it1), next(it2)

क्या यह बिल्कुल वैसा ही परिणाम नहीं है zip(seq1, seq2)?
निकल्स मर्त्स

@NiklasMertsch हाँ, इसका बिल्कुल वही परिणाम है। मैंने अभी उदाहरण दिया है कि ज़िप फंक्शन कैसा दिखता है
व्लाद बेजेन

0

आप समझ का उपयोग करके एक शून्य या सूची में nth तत्वों को बंडल कर सकते हैं, फिर उन्हें जनरेटर फ़ंक्शन के साथ पास आउट कर सकते हैं।

def iterate_multi(*lists):
    for i in range(min(map(len,lists))):
        yield tuple(l[i] for l in lists)

for l1, l2, l3 in iterate_multi([1,2,3],[4,5,6],[7,8,9]):
    print(str(l1)+","+str(l2)+","+str(l3))

-2

यदि कोई इस तरह की चीज़ की तलाश में है, तो मुझे यह बहुत सरल और आसान लगा:

list_1 = ["Hello", "World"]
list_2 = [1, 2, 3]

for a,b in [(list_1, list_2)]:
    for element_a in a:
        ...
    for element_b in b:
        ...

>> Hello
World
1
2
3

सूचियों को ज़िप () के विपरीत उनकी पूरी सामग्री के साथ पुनरावृत्त किया जाएगा, जो केवल न्यूनतम सामग्री लंबाई तक पुनरावृत्त करता है।


downvoters को इस बात पर टिप्पणी करनी चाहिए कि उन्होंने मेरे दृष्टिकोण के साथ क्या गलत पाया या यदि यह इस प्रश्न के संभावित समाधान के रूप में फिट नहीं है।
व्लादिसीटी 4

-3

यहाँ यह सूची समझ के साथ कैसे करें:

a = (1, 2, 3)
b = (4, 5, 6)
[print('f:', i, '; b', j) for i, j in zip(a, b)]

प्रिंट:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.