2016-01-28 3 views
2

дана строка этогоКак пропустить каждый путь сверху вниз в python?

s='MayaWindow|toolBar2|MainShelfLayout|formLayout14|ShelfLayout|Custom' 

, что это самый простой способ, чтобы получить список, как это в Python 2.7?

['MayaWindow','MayaWindow|toolBar2','MayaWindow|toolBar2|MainShelfLayout','MayaWindow|toolBar2|MainShelfLayout|formLayout14','MayaWindow|toolBar2|MainShelfLayout|formLayout14|ShelfLayout','MayaWindow|toolBar2|MainShelfLayout|formLayout14|ShelfLayout|Custom'] 

, такие как:

import re 
for t in s.split('|'): 
    print re.search(r'.*%s'%t,s).group() 

но он сломается, если некоторые имена папок в пути не являются уникальными, например

s='MayaWindow|toolBar2|MainShelfLayout|formLayout14|formLayout14|Custom' 

import re 
for t in s.split('|'): 
    print re.search(r'.*%s'%t,s).group() 

MayaWindow 
MayaWindow|toolBar2 
MayaWindow|toolBar2|MainShelfLayout 
MayaWindow|toolBar2|MainShelfLayout|formLayout14|formLayout14 
MayaWindow|toolBar2|MainShelfLayout|formLayout14|formLayout14 
MayaWindow|toolBar2|MainShelfLayout|formLayout14|formLayout14|Custom 

ответ

2

Однострочные:

>>> [s.rsplit("|", i)[0] for i in range(s.count("|"), -1, -1)] 
['MayaWindow', 
'MayaWindow|toolBar2', 
'MayaWindow|toolBar2|MainShelfLayout', 
'MayaWindow|toolBar2|MainShelfLayout|formLayout14', 
'MayaWindow|toolBar2|MainShelfLayout|formLayout14|ShelfLayout', 
'MayaWindow|toolBar2|MainShelfLayout|formLayout14|ShelfLayout|Custom'] 
1

Split его на ограничителе интереса, а затем петля через каждый размер среза:

s = 'MayaWindow|toolBar2|MainShelfLayout|formLayout14|ShelfLayout|Custom' 
l = s.split('|') 
new_list = [l[:idx] for idx in range(1, len(l)+1)] 

Результат:

>>> for item in new_list: 
...  print(*item) 
... 
MayaWindow 
MayaWindow toolBar2 
MayaWindow toolBar2 MainShelfLayout 
MayaWindow toolBar2 MainShelfLayout formLayout14 
MayaWindow toolBar2 MainShelfLayout formLayout14 ShelfLayout 
MayaWindow toolBar2 MainShelfLayout formLayout14 ShelfLayout Custom 

Или, если вы хотите строки, а не list с, join() их обратно на ограничителе:

new_list = ['|'.join(l[:idx]) for idx in range(1, len(l)+1)] 

Результат:

>>> for item in new_list: 
...  print(item) 
... 
MayaWindow 
MayaWindow|toolBar2 
MayaWindow|toolBar2|MainShelfLayout 
MayaWindow|toolBar2|MainShelfLayout|formLayout14 
MayaWindow|toolBar2|MainShelfLayout|formLayout14|ShelfLayout 
MayaWindow|toolBar2|MainShelfLayout|formLayout14|ShelfLayout|Custom 
2

из Python 3.2, itertools.accumulate позволяет во избежание использования индексации

from itertools import accumulate 
s = 'MayaWindow|toolBar2|MainShelfLayout|formLayout14|ShelfLayout|Custom' 

new_list = list(accumulate(s.split('|'), lambda x,y: '|'.join((x,y)))) 

print(new_list) 

производит

['MayaWindow', 'MayaWindow|toolBar2', 'MayaWindow|toolBar2|MainShelfLayout', 'MayaWindow|toolBar2|MainShelfLayout|formLayout14', 'MayaWindow|toolBar2|MainShelfLayout|formLayout14|ShelfLayout', 'MayaWindow|toolBar2|MainShelfLayout|formLayout14|ShelfLayout|Custom'] 

С другой стороны, в Python 2 вы можете сделать что-то вдоль линии

elements = iter(s.split('|')) 
acc = next(elements) 
new_list = [acc, ] 
for el in elements: 
    acc += '|'+el 
    new_list.append(acc) 

print(new_list) 
+0

Спасибо! Но как я могу сделать это в python 2.7? – Shuman

+0

см. Мое редактирование для одного способа сделать это – Pynchia

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