अन्य उत्तरों की आलोचना यहां करें:
इन उत्तरों में से कोई भी समान रूप से आकार नहीं है, वे सभी एक रन चंक को अंत में छोड़ देते हैं, इसलिए वे पूरी तरह से संतुलित नहीं हैं। यदि आप काम को वितरित करने के लिए इन कार्यों का उपयोग कर रहे थे, तो आपने दूसरों के सामने एक अच्छी तरह से खत्म होने की संभावना के लिए बिल्ट-इन किया है, इसलिए यह कुछ भी नहीं करने के लिए बैठेगा, जबकि अन्य कड़ी मेहनत करते रहेंगे।
उदाहरण के लिए, वर्तमान शीर्ष उत्तर के साथ समाप्त होता है:
[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
की बस padding रहे हैं, और नहीं बल्कि मेरी राय में असजीला। वे समान रूप से पुनरावृत्तियों को नहीं देख रहे हैं।
हम इन्हें बेहतर क्यों नहीं बाँट सकते?
मेरा समाधान
यहाँ एक संतुलित समाधान दिया गया है, जिसे मैंने उत्पादन में उपयोग किया है (नोट पायथन 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]]
ध्यान दें कि सन्निहित जनरेटर अन्य दो की तरह समान लंबाई के पैटर्न में विखंडन प्रदान करते हैं, लेकिन आइटम सभी क्रम में हैं, और वे समान रूप से विभाजित हैं क्योंकि कोई असतत तत्वों की सूची को विभाजित कर सकता है।