संपादित करें 2: ओपी नई आवश्यकता का उत्तर देने के
ranges = []
for key, group in groupby(enumerate(data), lambda (index, item): index - item):
group = map(itemgetter(1), group)
if len(group) > 1:
ranges.append(xrange(group[0], group[-1]))
else:
ranges.append(group[0])
आउटपुट:
[xrange(2, 5), xrange(12, 17), 20]
आप श्रृंखला के साथ xrange जगह ले सकता है या किसी अन्य कस्टम वर्ग।
अजगर डॉक्स इस के लिए एक बहुत साफ recipe है:
from operator import itemgetter
from itertools import groupby
data = [2, 3, 4, 5, 12, 13, 14, 15, 16, 17]
for k, g in groupby(enumerate(data), lambda (i,x):i-x):
print map(itemgetter(1), g)
आउटपुट:
[2, 3, 4, 5]
[12, 13, 14, 15, 16, 17]
आपको ठीक उसी उत्पादन प्राप्त करना चाहते हैं, तो आप ऐसा कर सकते हैं:
ranges = []
for k, g in groupby(enumerate(data), lambda (i,x):i-x):
group = map(itemgetter(1), g)
ranges.append((group[0], group[-1]))
आउट डाल:
[(2, 5), (12, 17)]
संपादित करें: उदाहरण पहले से ही दस्तावेज में समझाया गया है लेकिन शायद मैं इसे व्याख्या करनी चाहिए और अधिक:
समाधान की कुंजी एक सीमा के साथ differencing है तो कि लगातार संख्या सभी समूह में दिखाई देते हैं।
तो डेटा था: [2, 3, 4, 5, 12, 13, 14, 15, 16, 17]
फिर groupby(enumerate(data), lambda (i,x):i-x)
निम्नलिखित के बराबर है:
groupby(
[(0, 2), (1, 3), (2, 4), (3, 5), (4, 12),
(5, 13), (6, 14), (7, 15), (8, 16), (9, 17)],
lambda (i,x):i-x
)
लैम्ब्डा समारोह तत्व मूल्य से तत्व सूचकांक घटा देती है।तो जब आप प्रत्येक आइटम पर लैम्ब्डा लागू करते हैं। , बराबर कुंजी मान द्वारा
[-2, -2, -2, -2, -8, -8, -8, -8, -8, -8]
GroupBy समूहों तत्वों इसलिए पहले 4 तत्वों एक साथ और बहुत आगे समूह में रखा जाएगा: आप GroupBy निम्नलिखित चाबियाँ मिल जाएगा।
मुझे उम्मीद है कि यह इसे और अधिक पठनीय बनाता है।
क्या यह वापसी एक स्ट्रिंग मान है? –
आदर्श रूप से ऐसा कुछ पसंद करेंगे जो अलग-अलग प्रकार के रेंज बनाम स्टैंडअलोन संख्याओं का उपयोग करता है। – mikemaccana