2013-03-12 5 views
11

पर आधारित एक सूची को विभाजित करता है मेरे पास विभिन्न स्ट्रिंग मान वाली एक सूची है। जब भी मैं WORD देखता हूं तो मैं सूची को विभाजित करना चाहता हूं। परिणाम सूचियों की एक सूची होगी (जो मूल सूची के उपन्यासक होंगे) जिसमें WORD का बिल्कुल एक उदाहरण शामिल है, मैं इसे लूप का उपयोग करके कर सकता हूं लेकिन क्या यह प्राप्त करने के लिए अधिक पायथनिक तरीका है?पाइथन एक डेलीमीटर शब्द

उदाहरण = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D']

परिणाम = [['A'], ['WORD','B','C'],['WORD','D']]

यह है कि मैं क्या करने की कोशिश की है लेकिन यह वास्तव में प्राप्त नहीं करता है जो मैं चाहता क्योंकि यह एक अलग सूची में WORD रखा जाएगा कि यह होना चाहिए में:

def split_excel_cells(delimiter, cell_data): 

    result = [] 

    temp = [] 

    for cell in cell_data: 
     if cell == delimiter: 
      temp.append(cell) 
      result.append(temp) 
      temp = [] 
     else: 
      temp.append(cell) 

    return result 

उत्तर

10

मैं एक जनरेटर का प्रयोग करेंगे:

def group(seq, sep): 
    g = [] 
    for el in seq: 
     if el == sep: 
      yield g 
      g = [] 
     g.append(el) 
    yield g 

ex = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D'] 
result = list(group(ex, 'WORD')) 
print(result) 

यह

[['A'], ['WORD', 'B', 'C'], ['WORD', 'D']] 

कोड किसी भी iterable स्वीकार करता प्रिंट, और एक iterable पैदा करता है (जो आप नहीं कर एक सूची में समतल अगर आप नहीं करना चाहते हैं है)।

1

@ एनपीई का समाधान मुझे बहुत पागल दिखता है।

from itertools import izip, chain 
example = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D'] 
indices = [i for i,x in enumerate(example) if x=="WORD"] 
pairs = izip(chain([0], indices), chain(indices, [None])) 
result = [example[i:j] for i, j in pairs] 

इस कोड को मुख्य रूप से this answer पर आधारित है: यह itertools का उपयोग कर एक और एक है।

+0

:

[['A'], ['B', 'C'], ['D']] 

आप सीमांकक पर जोर देते हैं, तो शामिल किया जाना है, इस चाल करना चाहिए धन्यवाद मैंने इंडेक्स के आधार पर विभाजित करने का भी प्रयास किया लेकिन यह सुनिश्चित नहीं था कि उन्हें कैसे जोड़ा जाए। यह एक बहुत अच्छा तरीका है। – Cemre

10
import itertools 

lst = ['A', 'WORD', 'B' , 'C' , 'WORD' , 'D'] 
w = 'WORD' 

spl = [list(y) for x, y in itertools.groupby(lst, lambda z: z == w) if not x] 

इस सीमांकक के बिना एक splitted सूची बनाता है, जो मेरे लिए अधिक तार्किक दिखता है:

spl = [[]] 
for x, y in itertools.groupby(lst, lambda z: z == w): 
    if x: spl.append([]) 
    spl[-1].extend(y) 
+1

यह 'itertools' का एक उत्कृष्ट उपयोग है। –

+1

इस उत्तर का उपयोग करने के लिए दृढ़ता से सुझाव देते हैं क्योंकि यह बिल्टिन 'itertools' मॉड्यूल के साथ बहुत अधिक पाइथनिक है! – Drake

+0

दुर्भाग्य से, दूसरा संस्करण गलत परिणाम देता है अगर डिलीमीटर दोहराया जाता है। –

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