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)
কাজ করে? এটি আরও ভার্বোজ কোড দিয়ে লেখা থাকলে দেখতে কেমন হবে?
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)
কাজ করে? এটি আরও ভার্বোজ কোড দিয়ে লেখা থাকলে দেখতে কেমন হবে?
উত্তর:
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)
yield
গুলি (= return
গুলি) করে, আপনি এই আইটেমটিকে "গ্রাস" হিসাবে কল্পনা করতে পারেন। সুতরাং পরের বার পুনরাবৃত্তিকারীকে ডাকা হলে, এটি পরবর্তী "অপ্রচলিত" আইটেমটি দেয়।
অন্যান্য দুর্দান্ত উত্তর এবং মন্তব্যগুলি যুক্তি আনপ্যাকিং এবং জিপের ভূমিকা ভালভাবে ব্যাখ্যা করে () ।
হিসাবে ইগ্ন্যাশীয় এবং 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/
আমি মনে করি একটি উত্তর যা সমস্ত উত্তরে হারিয়েছে (সম্ভবত পুনরাবৃত্তিকারীদের সাথে পরিচিত তাদের কাছে তবে এটি অন্যদের কাছে স্পষ্ট নয়) -
যেহেতু আমাদের একই পুনরাবৃত্তি রয়েছে, এটি গ্রাস হয়ে যায় এবং বাকী উপাদানগুলি জিপ দ্বারা ব্যবহৃত হয়। সুতরাং যদি আমরা কেবল তালিকাটি ব্যবহার করি এবং এটির উদাহরণস্বরূপ না।
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)]
পুনরুক্তি ব্যবহার করে, মানগুলি পপ করে এবং কেবলমাত্র অবশিষ্ট থাকে। খুব সূক্ষ্ম জিনিস, তবে বেশ চালাক !!!
iter(s)
এর জন্য একটি পুনরাবৃত্তি প্রদান করে।
[iter(s)]*n
এর জন্য একই বারবারের জন্য এন বারের একটি তালিকা তৈরি করে।
সুতরাং, কাজ করার সময় zip(*[iter(s)]*n)
, তালিকা থেকে তিনটি পুনরাবৃত্তির ক্রম অনুসারে এটি একটি আইটেম বের করে। যেহেতু সমস্ত পুনরাবৃত্তকারী একই বস্তু, তাই এটি তালিকাগুলির খণ্ডগুলিতে ভাগ করে দেয় n
।
জিপ এইভাবে ব্যবহারের জন্য পরামর্শের একটি শব্দ। এটির দৈর্ঘ্য সমানভাবে বিভাজ্য না হলে এটি আপনার তালিকা কেটে যাবে। এটিকে ঘিরে কাজ করার জন্য আপনি হয় ভেরু মানগুলি গ্রহণ করতে পারলে 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
itertools
রেসিপিগুলিতে নথিভুক্ত করা হয়েছে : ডকস.পিথথন.আর grouper
. / 2 / লাইব্রেরি / সাইটটোলেস.ইচটিএমএল# রিসিপস । চাকাটি পুনর্নবীকরণের দরকার নেই
এটা সম্ভবত তা দেখতে অনুবাদক বা পাইথন ঘটছে সহজ ipython
সঙ্গে n = 2
:
In [35]: [iter("ABCDEFGH")]*2
Out[35]: [<iterator at 0x6be4128>, <iterator at 0x6be4128>]
সুতরাং, আমাদের কাছে দুটি পুনরাবৃত্তির একটি তালিকা রয়েছে যা একই পুনরাবৃত্ত বস্তুর দিকে নির্দেশ করছে। মনে রাখবেন যে iter
কোনও বস্তুতে একটি পুনরাবৃত্ত বস্তু প্রদান করে এবং এই দৃশ্যে এটি দুটি কারণে একই পুনরাবৃত্ত হয়*2
পাইথন সিনট্যাকটিক চিনির । আইট্রেটাররাও একবার চালায়।
উপরন্তু, zip
iterables কোন নম্বর (নেয় সিকোয়েন্স হয় 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)
বর্ণিত হিসাবে কাজ করে।
*
হ'ল কোনও বস্তুর সদৃশ করার সুবিধা। এটি স্কেলারের সাহায্যে এবং তারপরে তালিকাগুলি দিয়ে চেষ্টা করুন। print(*zip(*[iter("ABCDEFG")]*2))
বনাম চেষ্টা করুন print(*zip(*[iter("ABCDEFG"), iter("ABCDEFG")]))
। তারপরে দুটি বিবৃতিতে প্রকৃত পুনরাবৃত্তকারী বস্তুগুলি কী তা দেখতে দুটিকে ছোট ছোট পদক্ষেপে ছিঁড়ে শুরু করুন।