2009-09-18 14 views
11

क्या आप इसे अधिक सरल/सुरुचिपूर्ण बना सकते हैं?पाइथन प्रोग्राम एक सूची को वैकल्पिक तत्वों के साथ दो सूचियों में विभाजित करने के लिए

def zigzag(seq): 
    """Return two sequences with alternating elements from `seq`""" 
    x, y = [], [] 
    p, q = x, y 
    for e in seq: 
     p.append(e) 
     p, q = q, p 
    return x, y 

उत्तर

39

हैं seq, के रूप में आप कहते हैं, एक सूची है, तो यह है:

def zigzag(seq): 
    results = [], [] 
    for i, e in enumerate(seq): 
    results[i%2].append(e) 
    return results 
+1

SO इतना आलसी बना रहा है। –

+2

@ श्रीधर, इसे आलसी के रूप में नहीं सोचें, इसे * समय-कुशल * के रूप में सोचें। मैंने * * लूप (* x * कॉलम के लिए, केवल दो नहीं) के साथ ऐसा करने के लिए एल्गोरिदम पर काम करने में आधे घंटे बिताए। और हालांकि मुझे यह काम मिल गया, यह सिर्फ * पायथनिक * नहीं लग रहा था - मुझे संदेह था कि एक आसान तरीका था। निश्चित रूप से, मुझे याद नहीं आया कि सूचियों में * चरण * चर हैं (जैसा कि इस उत्तर में दिखाया गया है), जो इसे छोटा बनाता है। –

+0

यह सुंदर है, उस वाक्यविन्यास के बारे में भी नहीं पता था। धन्यवाद! – sleepycal

8
def zigzag(seq): 
    return seq[::2], seq[1::2] 
+0

केवल सूचियों के लिए काम करता है जबकि अन्य समाधान किसी भी प्रयोज्य के लिए काम करता है। –

+3

सच है, लेकिन शीर्षक ने एक सूची निर्दिष्ट की है – cobbal

9
:

def zigzag(seq): 
    return seq[::2], seq[1::2] 

हैं seq ऐसे संभवतः एक जनरेटर के रूप में एक पूरी तरह से सामान्य iterable है,

यह एक इटरेटर लेता है और दो पुनरावर्तक देता है:

import itertools 
def zigzag(seq): 
    t1,t2 = itertools.tee(seq) 
    even = itertools.islice(t1,0,None,2) 
    odd = itertools.islice(t2,1,None,2) 
    return even,odd 

यदि आप सूचियों को पसंद करते हैं तो आप return list(even),list(odd) कर सकते हैं।

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