2011-05-28 12 views
8

का उपयोग कर रहा है उदाहरण के लिए निम्न सूची एक सूची से अजगर उप-सूचियां बनाओ:एक सेपरेटर

['|', u'MOM', u'DAD', '|', u'GRAND', '|', u'MOM', u'MAX', u'JULES', '|'] 

और चाहते हैं कि उसे द्वारा विभाजित होने का "|" तो परिणाम इस तरह दिखेगा:

[[u'MOM', u'DAD'],[ u'GRAND'], [u'MOM', u'MAX', u'JULES']] 

मैं यह कैसे कर सकता हूं? मुझे केवल नेट पर sublists के उदाहरण मिलते हैं जिन्हें तत्वों की लंबाई की आवश्यकता होती है। जैसे

http://blog.samat.org/2005/06/05/splitting_a_sequence_into_subsequences_with_python

उत्तर

15
>>> [list(x[1]) for x in itertools.groupby(['|', u'MOM', u'DAD', '|', u'GRAND', '|', u'MOM', u'MAX', u'JULES', '|'], lambda x: x=='|') if not x[0]] 
[[u'MOM', u'DAD'], [u'GRAND'], [u'MOM', u'MAX', u'JULES']] 
+0

मेरे लिए यह समाधान जादू से भरा है लेकिन सही काम करता है! धन्यवाद – W0bble

+2

प्रारंभ के लिए [groupby दस्तावेज़ीकरण] (http://docs.python.org/library/itertools.html#itertools.groupby) पढ़ें। :-) –

+1

पूर्ण पंक्ति स्पष्टता के लिए है: '[सूची (x [1]) x में itertools.groupby (myList, lambda x: x ==' | ') में x [0]] ' – ninjagecko

4

itertools.groupby() करता है बहुत अच्छी तरह से ...

>>> import itertools 
>>> l = ['|', u'MOM', u'DAD', '|', u'GRAND', '|', u'MOM', u'MAX', u'JULES', '|'] 
>>> key = lambda sep: sep == '|' 
>>> [list(group) for is_key, group in itertools.groupby(l, key) if not is_key] 
[[u'MOM', u'DAD'], [u'GRAND'], [u'MOM', u'MAX', u'JULES']] 
+2

अरे! बहुत धीमा! – Johnsyweb

1

सरल सादे पुराने के लिए लूप (का उपयोग कर समाधान GroupBy समाधान है, जो BTW बेहतर है के लिए यह करने के लिए पीटा गया था !)

seq = ['|', u'MOM', u'DAD', '|', u'GRAND', '|', u'MOM', u'MAX', u'JULES', '|'] 

S=[] 
tmp=[] 

for i in seq: 
    if i == '|': 
     S.append(tmp) 
     tmp = [] 
    else: 
     tmp.append(i) 

# Remove empty lists 
while True: 
    try: 
     S.remove([]) 
    except ValueError: 
     break 

print S 

देता है
[[u'MOM', u'DAD'], [u'GRAND'], [u'MOM', u'MAX', u'JULES']] 
0
>>> reduce(
     lambda acc,x: acc+[[]] if x=='|' else acc[:-1]+[acc[-1]+[x]], 
     myList, 
     [[]] 
    ) 
[[], ['MOM', 'DAD'], ['GRAND'], ['MOM', 'MAX', 'JULES'], []] 
बेशक

आप, itertools.groupby उपयोग करने के लिए ही आप ध्यान दें कि मेरे दृष्टिकोण "सही ढंग से" सिरों पर खाली सूचियों डालता चाह सकते हैं चाहेंगे। =)

+0

जब आप "सही" कहते हैं, तो यह प्रश्न या लिंक किए गए आलेख से वांछित आउटपुट के साथ कैसे मेल खाता है? – Johnsyweb

+1

@ जॉन्सवेब मैं अच्छी तरह से जानता हूं। फिर भी विनिर्देश के अर्थशास्त्र हालांकि सुरुचिपूर्ण हैं और '[] .split (टोकन)' के बराबर होना चाहिए; इनपुट को सिरों पर '' | '' छोड़ देना चाहिए। – ninjagecko

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