পাইপনে জিপ (* [ইটার (গুলি)) * এন) কীভাবে কাজ করবে?


103
s = [1,2,3,4,5,6,7,8,9]
n = 3

zip(*[iter(s)]*n) # returns [(1,2,3),(4,5,6),(7,8,9)]

কিভাবে zip(*[iter(s)]*n)কাজ করে? এটি আরও ভার্বোজ কোড দিয়ে লেখা থাকলে দেখতে কেমন হবে?


1
এটি কীভাবে কাজ করে তাও এখানে ব্যাখ্যা করুন: স্ট্যাকওভারফ্লো
ম্যাট জেন্ডার

যদি উত্তরগুলি এখানে পর্যাপ্ত পরিমাণে না থাকে তবে আমি এখানে এটি ব্লগ করেছি: টেলিওট 99.blogspot.com/2010/01/…
Telliott99

7
যদিও খুব আগ্রহজনক, এই কৌশলটি অবশ্যই পাইথনের মূল "পাঠযোগ্যতা" মানের বিপরীতে যেতে হবে!
ডেমিস

উত্তর:


108

iter()একটি ক্রম উপর একটি পুনরাবৃত্তি। [x] * nসম্বলিত একটি তালিকা উত্পাদন করে nপরিমাণ x, অর্থাত্ দৈর্ঘ্য একটি তালিকা n, যেখানে প্রতিটি উপাদান x*argএকটি ক্রিয়াকলাপের জন্য আর্গুমেন্টে একটি ক্রম আনপ্যাক করে। অতএব আপনি একই পুনরুক্তিটি 3 বার এ যাচ্ছেন zip(), এবং এটি প্রতিটি বার পুনরুক্তিকারী থেকে একটি আইটেম টানছে।

x = iter([1,2,3,4,5,6,7,8,9])
print zip(x, x, x)

1
জেনে রাখা ভাল: যখন কোনও পুনরুক্তিকারী কোনও আইটেম yieldগুলি (= returnগুলি) করে, আপনি এই আইটেমটিকে "গ্রাস" হিসাবে কল্পনা করতে পারেন। সুতরাং পরের বার পুনরাবৃত্তিকারীকে ডাকা হলে, এটি পরবর্তী "অপ্রচলিত" আইটেমটি দেয়।
উইঙ্কলারr

46

অন্যান্য দুর্দান্ত উত্তর এবং মন্তব্যগুলি যুক্তি আনপ্যাকিং এবং জিপের ভূমিকা ভালভাবে ব্যাখ্যা করে ()

হিসাবে ইগ্ন্যাশীয় এবং ujukatzel বলো, পাস zip()একই পুনরুক্তিকারীর তিন রেফারেন্স এবং zip()অর্ডার-থেকে পুনরুক্তিকারীর প্রতিটি রেফারেন্স পূর্ণসংখ্যার অফ 3-tuples তোলে:

1,2,3,4,5,6,7,8,9  1,2,3,4,5,6,7,8,9  1,2,3,4,5,6,7,8,9
^                    ^                    ^            
      ^                    ^                    ^
            ^                    ^                    ^

এবং যেহেতু আপনি আরও ভার্বোজ কোড নমুনা চেয়েছেন:

chunk_size = 3
L = [1,2,3,4,5,6,7,8,9]

# iterate over L in steps of 3
for start in range(0,len(L),chunk_size): # xrange() in 2.x; range() in 3.x
    end = start + chunk_size
    print L[start:end] # three-item chunks

মান অনুসরণ startএবং end:

[0:3) #[1,2,3]
[3:6) #[4,5,6]
[6:9) #[7,8,9]

এফডাব্লুআইডাব্লু, আপনি map()প্রাথমিক যুক্তি দিয়ে একই ফলাফলটি পেতে পারেন None:

>>> map(None,*[iter(s)]*3)
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]

আরও zip()এবং এর জন্য map(): http://muffinresearch.co.uk/archives/2007/10/16/python-transposing-lists-with-map-and-zip/


31

আমি মনে করি একটি উত্তর যা সমস্ত উত্তরে হারিয়েছে (সম্ভবত পুনরাবৃত্তিকারীদের সাথে পরিচিত তাদের কাছে তবে এটি অন্যদের কাছে স্পষ্ট নয়) -

যেহেতু আমাদের একই পুনরাবৃত্তি রয়েছে, এটি গ্রাস হয়ে যায় এবং বাকী উপাদানগুলি জিপ দ্বারা ব্যবহৃত হয়। সুতরাং যদি আমরা কেবল তালিকাটি ব্যবহার করি এবং এটির উদাহরণস্বরূপ না।

l = range(9)
zip(*([l]*3)) # note: not an iter here, the lists are not emptied as we iterate 
# output 
[(0, 0, 0), (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5), (6, 6, 6), (7, 7, 7), (8, 8, 8)]

পুনরুক্তি ব্যবহার করে, মানগুলি পপ করে এবং কেবলমাত্র অবশিষ্ট থাকে। খুব সূক্ষ্ম জিনিস, তবে বেশ চালাক !!!


+1, আপনি আমাকে বাঁচিয়েছেন! আমি বিশ্বাস করতে পারি না যে এই উত্তরটি প্রত্যেকে এটিকে জানে বলে ধরে নিয়ে এই গুরুত্বপূর্ণ তথ্য এড়িয়ে গেছে sk আপনি এই তথ্য অন্তর্ভুক্ত একটি ডকুমেন্টেশন কোন রেফারেন্স দিতে পারেন?
স্নেহাশীষ কর্মকার

9

iter(s) এর জন্য একটি পুনরাবৃত্তি প্রদান করে।

[iter(s)]*n এর জন্য একই বারবারের জন্য এন বারের একটি তালিকা তৈরি করে।

সুতরাং, কাজ করার সময় zip(*[iter(s)]*n), তালিকা থেকে তিনটি পুনরাবৃত্তির ক্রম অনুসারে এটি একটি আইটেম বের করে। যেহেতু সমস্ত পুনরাবৃত্তকারী একই বস্তু, তাই এটি তালিকাগুলির খণ্ডগুলিতে ভাগ করে দেয় n


7
'একই তালিকার এন পুনরাবৃত্তিকারী' নয়, 'একই বারের পুনরুদ্ধারকারী বস্তুর n বার'। বিভিন্ন পুনরাবৃত্তকারী অবজেক্টগুলি একই তালিকাতে থাকা অবস্থায়ও রাষ্ট্র ভাগ করে না।
টমাস ওয়াউটারস

ধন্যবাদ, সংশোধন। প্রকৃতপক্ষে এটি ছিল আমি "চিন্তা", কিন্তু অন্য কিছু লিখেছিলাম।
sttwister

6

জিপ এইভাবে ব্যবহারের জন্য পরামর্শের একটি শব্দ। এটির দৈর্ঘ্য সমানভাবে বিভাজ্য না হলে এটি আপনার তালিকা কেটে যাবে। এটিকে ঘিরে কাজ করার জন্য আপনি হয় ভেরু মানগুলি গ্রহণ করতে পারলে itertools.izip_longest ব্যবহার করতে পারেন। অথবা আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন:

def n_split(iterable, n):
    num_extra = len(iterable) % n
    zipped = zip(*[iter(iterable)] * n)
    return zipped if not num_extra else zipped + [iterable[-num_extra:], ]

ব্যবহার:

for ints in n_split(range(1,12), 3):
    print ', '.join([str(i) for i in ints])

ছাপে:

1, 2, 3
4, 5, 6
7, 8, 9
10, 11

3
এটি ইতিমধ্যে itertoolsরেসিপিগুলিতে নথিভুক্ত করা হয়েছে : ডকস.পিথথন.আর grouper . / 2 / লাইব্রেরি / সাইটটোলেস.ইচটিএমএল# রিসিপস । চাকাটি পুনর্নবীকরণের দরকার নেই
জামিলাক

1

এটা সম্ভবত তা দেখতে অনুবাদক বা পাইথন ঘটছে সহজ ipythonসঙ্গে n = 2:

In [35]: [iter("ABCDEFGH")]*2
Out[35]: [<iterator at 0x6be4128>, <iterator at 0x6be4128>]

সুতরাং, আমাদের কাছে দুটি পুনরাবৃত্তির একটি তালিকা রয়েছে যা একই পুনরাবৃত্ত বস্তুর দিকে নির্দেশ করছে। মনে রাখবেন যে iterকোনও বস্তুতে একটি পুনরাবৃত্ত বস্তু প্রদান করে এবং এই দৃশ্যে এটি দুটি কারণে একই পুনরাবৃত্ত হয়*2 পাইথন সিনট্যাকটিক চিনির । আইট্রেটাররাও একবার চালায়।

উপরন্তু, zipiterables কোন নম্বর (নেয় সিকোয়েন্স হয় iterables ) এবং ইনপুট ক্রম প্রতিটি i'th উপাদান থেকে tuple সৃষ্টি করে। যেহেতু উভয় পুনরুক্তিকারী আমাদের ক্ষেত্রে অভিন্ন, তাই জিপ আউটপুট প্রতিটি 2-উপাদান টিপল জন্য একই পুনরুক্তিকারী দুবার সরানো।

In [41]: help(zip)
Help on built-in function zip in module __builtin__:

zip(...)
    zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]

    Return a list of tuples, where each tuple contains the i-th element
    from each of the argument sequences.  The returned list is truncated
    in length to the length of the shortest argument sequence.

আন-প্যাক ( *) অপারেটর নিশ্চিত করে যে iterators নিঃশেষিত হয়ে যায় যা এই ক্ষেত্রে না হওয়া পর্যন্ত সেখানে একটি 2-উপাদান tuple তৈরি করতে যথেষ্ট ইনপুট নয় চালানো।

এটি কোনও মান পর্যন্ত বাড়ানো যেতে পারে nএবং zip(*[iter(s)]*n)বর্ণিত হিসাবে কাজ করে।


ধীর হওয়ার জন্য দুঃখিত তবে আপনি "2 পাইথন সিনট্যাকটিক চিনির কারণে একই পুনরুদ্ধারকারীকে দু'বার ব্যাখ্যা করতে পারেন te অনুগ্রহ করে? যদি তাই হয় তবে কীভাবে ফলাফল আসবে না [("এ", "এ") ....]? ধন্যবাদ।
বোভেন লিউ

@ বোয়েনলাইউ *হ'ল কোনও বস্তুর সদৃশ করার সুবিধা। এটি স্কেলারের সাহায্যে এবং তারপরে তালিকাগুলি দিয়ে চেষ্টা করুন। print(*zip(*[iter("ABCDEFG")]*2))বনাম চেষ্টা করুন print(*zip(*[iter("ABCDEFG"), iter("ABCDEFG")]))। তারপরে দুটি বিবৃতিতে প্রকৃত পুনরাবৃত্তকারী বস্তুগুলি কী তা দেখতে দুটিকে ছোট ছোট পদক্ষেপে ছিঁড়ে শুরু করুন।
আখন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.