2010-02-09 24 views
22

मनमानी लंबाई उप सूचियों के लिए कटा हुआ उप-सूची अनुभागों की सूची में सूची को टुकड़ा करने का सबसे सरल और उचित रूप से प्रभावी तरीका क्या है।उप-सूचियों की सूची में एक सूची को स्लाइड करना

उदाहरण के लिए, यदि हमारे स्रोत सूची है:

input = [1, 2, 3, 4, 5, 6, 7, 8, 9, ... ] 

और हमारे उप सूची लंबाई 3 है तो हम तलाश:

output = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], ... ] 

इसी तरह अगर हमारे उप सूची लंबाई 4 है तो हम तलाश:

output = [ [1, 2, 3, 4], [5, 6, 7, 8], ... ] 
+2

@ जेम्स: आपका जोड़ बिल्कुल कोई प्रासंगिकता नहीं है। – SilentGhost

+1

आपको इस प्रश्न की चर्चा में रुचि हो सकती है (http://stackoverflow.com/questions/2095637) – telliott99

+0

आप numpy के array_split फ़ंक्शन का उपयोग कर सकते हैं उदाहरण के लिए, 'np.array_split (np.array (डेटा), 20) 'विभाजित करने के लिए 20 लगभग बराबर आकार के टुकड़ों में। यह सुनिश्चित करने के लिए कि आकार आकार में 'np.split' के बराबर बराबर हैं। – AlexG

उत्तर

64
[input[i:i+n] for i in range(0, len(input), n)]  # use xrange in py2k 

जहां n एक खंड की लंबाई है।

चूंकि आप परिभाषित नहीं करते हैं कि नई सूची के अंतिम तत्व के साथ क्या हो सकता है जब input में तत्वों की संख्या n द्वारा विभाजित नहीं है, मुझे लगता है कि यह कोई महत्व नहीं है: इसके साथ आपको अंतिम तत्व मिलेगा बराबर 2 अगर n बराबर 7, उदाहरण के लिए।

14

itertools मॉड्यूल के प्रलेखन निम्नलिखित recipe शामिल हैं:

>>> list(grouper(2, [1,2,3,4,5,6,7])) 
[(1, 2), (3, 4), (5, 6), (7, None)] 
+0

जबकि यह किसी भी पुनरावर्तनीय के साथ काम कर रहा है, यह दिए गए कार्य पर लागू होने पर मेरे कोड के रूप में कुशल (कम से कम मेरे परीक्षणों में) प्रतीत नहीं होता है। – SilentGhost

+3

@SilentGost, समयपूर्व अनुकूलन? –

+1

@ माइक: मैं क्षमा चाहता हूँ? – SilentGhost

0

मैं SilentGhost के समाधान की तरह:

import itertools 

def grouper(n, iterable, fillvalue=None): 
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" 
    args = [iter(iterable)] * n 
    return itertools.izip_longest(fillvalue=fillvalue, *args) 

इस समारोह इच्छित लंबाई की tuples के पुनरावर्तक देता है।

मेरे समाधान अजगर में कार्यात्मक प्रोग्रामिंग का उपयोग करता है:

group = lambda t, n: zip(*[t[i::n] for i in range(n)]) 
group([1, 2, 3, 4], 2) 

देता है:

[(1, 2), (3, 4)] 

मतलब यह है कि इनपुट सूची आकार समूह आकार से विभाज्य है। यदि नहीं, unpaired तत्व शामिल नहीं किया जाएगा।

+0

आपका दूसरा उदाहरण पायथन-2.x तक सीमित है। py3k 'map' में पहले तर्क के रूप में 'कोई नहीं' नहीं ले सकता है। – SilentGhost

+0

@ सिलेंटगोस्ट: आप सही हैं, हालांकि मैं इसे हटा रहा हूं। – MKTech

7

वास्तव में एक pythonic संस्करण (अजगर 3):

list(zip(*(iter([1,2,3,4,5,6,7,8,9]),)*3)) 

एक सूची इटरेटर बनाया है और 3x के साथ एक टपल ही इटरेटर में बदल गया है, तो ज़िप और फिर से सूचीबद्ध करने के लिए casted को अनपैक किया। प्रत्येक मान को ज़िप द्वारा प्रत्येक इटरेटर से खींचा जाता है, लेकिन जैसा कि केवल एक ही इटेरेटर ऑब्जेक्ट होता है, आंतरिक काउंटर को तीनों के लिए विश्व स्तर पर बढ़ाया जाता है।

+2

यह समाधान शानदार है, लेकिन अगर मुझे पायथन के ज़ेन पर विचार करना पड़ा तो मैं कहूंगा कि यह बहुत "पायथनिक" नहीं है: पी – AkiRoss

+1

सच है, यह एक गैर-पायथनिक पायथनिक समाधान है ;-) – CoDEmanX

+0

काम नहीं करता है अगर लेन का मोड सूची 0 नहीं है! –

संबंधित मुद्दे