সমান্তরালে দুটি তালিকার মাধ্যমে পুনরাবৃত্তি কিভাবে?


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]

তবে এটাই আমার কাছে কিছুটা দুর্বিষহ বলে মনে হচ্ছে। এটা করতে একটি ভাল উপায় আছে কি?

উত্তর:


1347

পাইথন ঘ

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

zipযখন সংক্ষিপ্ত fooবা বন্ধ হয়ে যায় তখন barথামে।

ইন পাইথন 3 , zip tuples একজন পুনরুক্তিকারীর মত ফেরৎ itertools.izipPython2 হবে। টিপলগুলির একটি তালিকা পেতে, ব্যবহার করুন list(zip(foo, bar))। এবং উভয় পুনরাবৃত্তি শেষ না হওয়া পর্যন্ত জিপ করতে, আপনি itertools.zip_longest ব্যবহার করবেন

পাইথন 2

ইন পাইথন 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)

izipহয় fooবা barক্লান্ত হয়ে গেলে থামে । izip_longestউভয় বন্ধ হয়ে যায় fooএবং barক্লান্ত হয়ে পড়ে। সংক্ষিপ্ত পুনরাবৃত্তি (গুলি) ক্লান্ত হয়ে গেলে, সেই পুনরুক্তরের izip_longestসাথে সম্পর্কিত 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

@ ইউন্টবু কেন আমি ওপেনের পদ্ধতিকে কেন তার চেয়ে বেশি পছন্দ করব izip(যদিও izip/ zipদেখতে আরও পরিষ্কার দেখায়)?
আর্মউন্ডল

3
আপনি প্রথমে পাইথন 3 উল্লেখ করতে চাইতে পারেন, কারণ এটি সম্ভবত আরও ভবিষ্যতের প্রমাণ। তদ্ব্যতীত, এটি উল্লেখ করা দরকার যে পাইথন 3-তে জিপ () এর ঠিক সেই সুবিধা রয়েছে যা কেবল পাইথন 2-তে কেবল itertools.izip () লাভ করেছিল এবং সুতরাং এটি সাধারণত যাওয়ার পথ।
ড্যানিয়েল এস

3
আমি কি আপনাকে উত্তরটি পরিষ্কারভাবে উল্লেখ করতে বলতে পারি যে zipএবং যে - zipমত ফাংশনগুলি itertoolsকেবলমাত্র 2 টি নয় তবে পুনরাবৃত্ত সংখ্যাগুলি গ্রহণ করে? এই প্রশ্নটি এখন প্রচলিত এবং আপনার উত্তরটি আপডেট করার পক্ষে একমাত্র।
ভোল্টা

অতিরিক্তভাবে আমি কি সূচক চাই i? আমি কি জিপটি গণনা করতে পারি?
চার্লি পার্কার 18

2
@CharlieParker: হ্যাঁ আপনি যা করতে পারেন, কিন্তু তারপর আপনি ব্যবহার করেন for i, (f, b) in enumerate(zip(foo, bar))
unutbu

60

আপনি zipফাংশন চান ।

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

11
পাইথন 3.0 এর আগে itertools.izipআপনি যদি প্রচুর পরিমাণে উপাদান ব্যবহার করতে চান তবে ব্যবহার করতে চান ।
জর্জি শুলি

15

আপনার ' জিপ ' ফাংশন ব্যবহার করা উচিত । আপনার নিজের জিপ ফাংশনটি কেমন দেখতে পারে তা এখানে একটি উদাহরণ

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

এর ঠিক একই ফলাফল হয় না zip(seq1, seq2)?
নিক্লাস মার্টশ

@ নিক্লাসমার্টস্ হ্যাঁ এর ঠিক একই ফলাফল রয়েছে। জিপ ফাংশনটি কেমন দেখায় আমি কেবল তার উদাহরণ দিয়েছি
ভ্লাদ বেজডেন

0

আপনি বোধগম্যতা ব্যবহার করে নবম উপাদানগুলিকে একটি টিপল বা তালিকায় বান্ডিল করতে পারেন, তারপরে এগুলি জেনারেটরের কার্যক্রমে প্রেরণ করুন।

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

তালিকাগুলি তাদের সম্পূর্ণ সামগ্রী দিয়ে পুনরাবৃত্তি হবে জিপ () এর বিপরীতে যা কেবল সর্বনিম্ন সামগ্রীর দৈর্ঘ্য পর্যন্ত পুনরাবৃত্তি করে।


ডাউনভোটাররা আমার পদ্ধতির সাথে তাদের কী ভুল বলে মন্তব্য করেছে বা এটি যদি এই প্রশ্নের সম্ভাব্য সমাধান হিসাবে ফিট না করে তবে তাদের মন্তব্য করা উচিত।
ভ্লাদিসি 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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.