2010-03-17 11 views
9

एक सूचीपायथन में एक सूची से एन आइटम के समूह लेने के लिए बेवकूफ तरीका?

A = [1 2 3 4 5 6] 

वहाँ किसी भी मुहावरेदार (pythonic) जिस तरह से इस पर पुनरावृति करने के लिए जैसे कि यह

B = [(1, 2) (3, 4) (5, 6)] 

अनुक्रमण के अलावा अन्य थे है को देखते हुए? यही कारण है कि सी से एक पकड़ मिली थी की तरह लगता है:

for a1,a2 in [ (A[i], A[i+1]) for i in range(0, len(A), 2) ]: 

मैं मदद नहीं कर सकता लेकिन लग रहा है कुछ चालाक itertools या टुकड़ा करने की क्रिया या कुछ का उपयोग कर हैक होना चाहिए।

(बेशक, एक समय में दो सिर्फ एक उदाहरण है, मैं एक समाधान है कि किसी भी n के लिए काम करता है चाहते हैं।)

संपादित करें: संबंधित Iterate over a string 2 (or n) characters at a time in Python लेकिन फिर भी साफ समाधान (स्वीकार किए जाते हैं, ज़िप का उपयोग) नहीं करता है एक सूची समझ और * -नोटेशन के बिना उच्च एन के लिए अच्छी तरह से सामान्यीकृत नहीं है।

+0

मुझे लगता है कि अपने सी पकड़ मिली थी कि बुरा नहीं लगता है, लेकिन मैं 'लिखते हैं एक [i: i + 1]' बजाय 'एक [i], एक [ i + 1] '। मनमाने ढंग से 'एन' तक विस्तार करना आसान है। –

+1

डुप्लिकेट: भाग में एक सूची में फिर से शुरू करने के लिए सबसे अधिक "पायथनिक" तरीका क्या है? http://stackoverflow.com/questions/434287/what-is-the-most-pythonic-way-to-iterate-over-a-list-in-chunks यह भी देखें http://stackoverflow.com/questions/312443/कैसे-करें-आप-विभाजित-एक-सूची-इन-समान रूप से आकार-भाग-इन-पायथन http://stackoverflow.com/questions/1335392/iteration-over-list-slices http://stackoverflow.com/प्रश्न/760753/iterate-over-a-python-sequence-in-multiples-of-n – jfs

+0

[संदर्भित स्वीकृत उत्तर] (http://stackoverflow.com/a/1162636/923794) वास्तव में एक साफ, नहीं है -कोपी समाधान, और सूची समझ या * -नोटेशन की कोई आवश्यकता नहीं है। अंत में, आप कहीं भी डेटा पर लूप करना चाहते हैं, इसलिए किसी भी लूप/समझ/जेनरेटर अतिरिक्त कीमत पर नहीं आते हैं। यदि आप इसे अधिक कॉम्पैक्ट पसंद करते हैं तो संदर्भित itertools.islice आधारित समाधान को फ़ंक्शन में Encapsulate करें। – cfi

उत्तर

11

http://docs.python.org/library/itertools.html से:

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

i = grouper(3,range(100)) 
i.next() 
(0, 1, 2) 
+0

यह विषयपरक रूप से बेवकूफ नहीं हो सकता है या सूची समझ और * नोटेशन से बच सकता है, लेकिन यह दस्तावेज में होने के लिए पर्याप्त "पायथनिक" है। – MattH

+0

आह, मुझे पता था कि यह कहीं मौजूद था। धन्यवाद! – Wang

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