2013-04-17 5 views
2

У меня есть список следующим образом:питона список Расщепление по ключевому слову

['MARK_A', 8, 7702.5, 13, 7703, 983472], 
['MARK_B', 10, 7702.5, 983472], 
['MARK_B', 3, 7703.5, 983472], 
['MARK_B', 6, 7701.2, 983472], 
['MARK_B', 5, 7704.4, 983472], 
['MARK_A', 9, 7701.5, 11, 7704, 983475], 
['MARK_B', 10, 7702.5, 983475], 
['MARK_B', 3, 7703.5, 983475], 
['MARK_B', 6, 7701.2, 983475], 
['MARK_B', 5, 7704.4, 983475]] 

Как можно разделить этот список на 2 списках, как выглядит следующим образом:

[['MARK_A', 8, 7702.5, 13, 7703, 983472], 
['MARK_B', 10, 7702.5, 983472], 
['MARK_B', 3, 7703.5, 983472], 
['MARK_B', 6, 7701.2, 983472], 
['MARK_B', 5, 7704.4, 983472]], 
[ ['MARK_A', 9, 7701.5, 11, 7704, 983475], 
['MARK_B', 10, 7702.5, 983475], 
['MARK_B', 3, 7703.5, 983475], 
['MARK_B', 6, 7701.2, 983475], 
['MARK_B', 5, 7704.4, 983475]] 

Там может быть любое количество «MARK_A» в списке, за которым следует один или несколько «MARK_B». Я бы разделив списки элементом [-1]

+0

Он всегда начинается с MARK_A вправо? – jamylak

+0

Всегда начинается с MARK_A да. Было бы идеально, если бы по возможности разделилось на последний элемент. – user1862895

ответ

3

я использую itertools.groupby для такого рода проблем (есть коллекция коллекций, разделить его на лексемы во внутренних коллекциях)

from itertools import groupby 

class GroupbyHelper: 
    def __init__(self, token): 
     self.token = token 
     self.count = 0 

    def __call__(self, item): 
     self.count += (item[0] == self.token) 
     return self.count 


grouped_collections = \ 
[list(grouped) for _, grouped in groupby(collections, GroupbyHelper("MARK_A"))] 

несколько обобщенная версия указанного код:

from itertools import groupby 

class GroupbyHelper: 
    def __init__(self, check_token): 
     self.check_token = check_token 
     self.count = 0 

    def __call__(self, item): 
     self.count += self.check_token(item) 
     return self.count 


grouped_collections = \ 
[list(grouped) for _, grouped in 
groupby(collections, GroupbyHelper(lambda x: x[0] == "MARK_A"))] 

с использованием двух итераторов:

from itertools import tee, zip_longest 

iter1, iter2 = tee(i for i, item in enumerate(collections) if item[0] == 'MARK_A') 
next(iter2) #advance the second iterator so we can move by range 

grouped_collections = \ 
[collections[s:e] for s, e in zip_longest(iter1, iter2, fillvalue=len(collections))] 

иногда простая петля не так уж плоха:

grouped_collections = [] 
for lst in collections: 
    if lst[0]=="MARK_A": 
     grouped_collections.append([lst]) 
    else: 
     grouped_collections[-1].append(lst) 
+0

Удалите вызов 'bool'. Это нормально рассматривать как «int's», и это уже «bool». В противном случае очень умное решение – jamylak

+0

@jamylak да, это не обязательно, но иногда, когда я читаю свои старые коды 'A + = B == C', меня несколько смущает. это нормально удалить 'bool (a == b)'. – thkang

+0

еще одна мелочь, вероятно, лучше не называть переменные 'collections', так как это имя модуля – jamylak

Смежные вопросы