2013-04-19 4 views
2

Есть ли удобный pythonic способ разбиения списка на строку поиска (даже если список содержит нестрочные и имеет вложенные списки). Так, например, сказать, что я хотел бы разделить следующее по '':Разбиение списка списков и строк по строкам

[[ 'something', ',', 'eh' ], ',', ['more'], ',', 'yet more', '|', 'even more' ] 

Это стало бы:

[[[ 'something', ',', 'eh' ]], [['more']], ['yet more', '|', 'even more']] 

ответ

7

Взгляните на itertools.groupby:

In [1]: from itertools import groupby 

In [2]: lst = [[ 'something', ',', 'eh' ], ',', ['more'], ',', 'yet more', '|', 'even more' ] 

In [3]: [list(group) for key, group in groupby(lst, lambda x: x!=',') if key] 
Out[3]: [[['something', ',', 'eh']], [['more']], ['yet more', '|', 'even more']] 

Это в основном шпагат элементы в вашем списке в группы на основе критериев (item != ','), а проверка понимания if k отфильтровывает группы False - это i тем, которые равны ','.

In [4]: for key, group in groupby(lst, lambda x: x!=','): 
    ...:  print key, list(group) 
    ...:  
True [['something', ',', 'eh']] 
False [','] 
True [['more']] 
False [','] 
True ['yet more', '|', 'even more'] 
+0

я собрал решение будет какая-то магия в itertools. – astex

+0

@astex - ну, он разбивает элементы в вашем списке на группы на основе '! = ','', А проверка понимания 'if k' отфильтровывает группы, которые являются' False' - это элементы, которые равны ' '' '. – root

+0

Эквивалентно 'from functools import partial'' из оператора import ne '' [list (g) для k, g в groupby (L, key = partial (ne, ',')), если k] ' – jamylak

0

Late к партии, но FWIW, я думаю, что сочетание itertools.takewhile и iter со значением дозорного обеспечивает быстрое решение

from itertools import takewhile 

z = [[ 'something', ',', 'eh' ], ',', ['more'], ',', 
    'yet more', '|', 'even more' ] 
z = iter(z) 
def provider(): 
    return list(takewhile(lambda x: x != ',', z)) 

for i in iter(provider, []): 
    print i 

... 
[['something', ',', 'eh']] 
[['more']] 
['yet more', '|', 'even more'] 
Смежные вопросы