অন্যান্য উত্তরের সমালোচনা এখানে:
এগুলির কোনও উত্তর সমান আকারের নয়, এগুলি সব শেষে একটি ক্ষুদ্র অংশ ছেড়ে যায়, সুতরাং এগুলি সম্পূর্ণ ভারসাম্যহীন নয়। আপনি যদি কাজগুলি বিতরণ করার জন্য এই ফাংশনগুলি ব্যবহার করে থাকেন তবে আপনি অন্যটির আগে কোনওটির ভাল শেষ হওয়ার সম্ভাবনাটি বিল্ট-ইন করে রেখেছেন, সুতরাং অন্যরা কঠোর পরিশ্রম অব্যাহত রাখার সময় এটি কিছুই না করে বসে থাকবে।
উদাহরণস্বরূপ, বর্তমান শীর্ষের উত্তরটি এর সাথে শেষ হয়:
[60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
[70, 71, 72, 73, 74]]
আমি শেষ পর্যন্ত এই খণ্ডকে ঘৃণা করি!
অন্যরা মত list(grouper(3, xrange(7)))
, এবং chunk(xrange(7), 3)
উভয় রিটার্ন: [(0, 1, 2), (3, 4, 5), (6, None, None)]
। None
এর মাত্র প্যাডিং প্রয়োগ করা হয়, এবং বরং আমার মতে অসুন্দর। তারা সমানভাবে পুনরাবৃত্তিকে ছাঁটাই করছে না।
কেন আমরা এগুলি আরও ভাল ভাগ করতে পারি না?
আমার সমাধান (গুলি)
এখানে একটি সুষম সমাধান, একটি ফাংশন থেকে অভিযোজিত আমি উৎপাদনে ব্যবহার করেছি (পাইথন 3 নোট প্রতিস্থাপন এর xrange
সঙ্গে range
):
def baskets_from(items, maxbaskets=25):
baskets = [[] for _ in xrange(maxbaskets)] # in Python 3 use range
for i, item in enumerate(items):
baskets[i % maxbaskets].append(item)
return filter(None, baskets)
এবং আমি একটি জেনারেটর তৈরি করেছি যা যদি আপনি এটি তালিকায় রাখেন তবে একই কাজ করে:
def iter_baskets_from(items, maxbaskets=3):
'''generates evenly balanced baskets from indexable iterable'''
item_count = len(items)
baskets = min(item_count, maxbaskets)
for x_i in xrange(baskets):
yield [items[y_i] for y_i in xrange(x_i, item_count, baskets)]
এবং পরিশেষে, যেহেতু আমি দেখতে পেয়েছি যে উপরের সমস্ত ফাংশন উপাদানগুলিকে একটি সুসংগত ক্রমে ফিরে আসে (যেমন তারা দেওয়া হয়েছিল):
def iter_baskets_contiguous(items, maxbaskets=3, item_count=None):
'''
generates balanced baskets from iterable, contiguous contents
provide item_count if providing a iterator that doesn't support len()
'''
item_count = item_count or len(items)
baskets = min(item_count, maxbaskets)
items = iter(items)
floor = item_count // baskets
ceiling = floor + 1
stepdown = item_count % baskets
for x_i in xrange(baskets):
length = ceiling if x_i < stepdown else floor
yield [items.next() for _ in xrange(length)]
আউটপুট
সেগুলি পরীক্ষা করার জন্য:
print(baskets_from(xrange(6), 8))
print(list(iter_baskets_from(xrange(6), 8)))
print(list(iter_baskets_contiguous(xrange(6), 8)))
print(baskets_from(xrange(22), 8))
print(list(iter_baskets_from(xrange(22), 8)))
print(list(iter_baskets_contiguous(xrange(22), 8)))
print(baskets_from('ABCDEFG', 3))
print(list(iter_baskets_from('ABCDEFG', 3)))
print(list(iter_baskets_contiguous('ABCDEFG', 3)))
print(baskets_from(xrange(26), 5))
print(list(iter_baskets_from(xrange(26), 5)))
print(list(iter_baskets_contiguous(xrange(26), 5)))
যা মুদ্রণ করে:
[[0], [1], [2], [3], [4], [5]]
[[0], [1], [2], [3], [4], [5]]
[[0], [1], [2], [3], [4], [5]]
[[0, 8, 16], [1, 9, 17], [2, 10, 18], [3, 11, 19], [4, 12, 20], [5, 13, 21], [6, 14], [7, 15]]
[[0, 8, 16], [1, 9, 17], [2, 10, 18], [3, 11, 19], [4, 12, 20], [5, 13, 21], [6, 14], [7, 15]]
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14], [15, 16, 17], [18, 19], [20, 21]]
[['A', 'D', 'G'], ['B', 'E'], ['C', 'F']]
[['A', 'D', 'G'], ['B', 'E'], ['C', 'F']]
[['A', 'B', 'C'], ['D', 'E'], ['F', 'G']]
[[0, 5, 10, 15, 20, 25], [1, 6, 11, 16, 21], [2, 7, 12, 17, 22], [3, 8, 13, 18, 23], [4, 9, 14, 19, 24]]
[[0, 5, 10, 15, 20, 25], [1, 6, 11, 16, 21], [2, 7, 12, 17, 22], [3, 8, 13, 18, 23], [4, 9, 14, 19, 24]]
[[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25]]
লক্ষ্য করুন যে সংক্ষিপ্ত জেনারেটর অন্যান্য দুটি হিসাবে একই দৈর্ঘ্যের ধরণগুলিতে খণ্ড সরবরাহ করে তবে আইটেমগুলি সমস্ত ক্রমযুক্ত এবং এগুলি সমানভাবে বিভক্ত হয় যেমন একটি পৃথক উপাদানগুলির তালিকায় বিভক্ত হতে পারে।