如何在 python 中从上到下遍历每条路径?

How do I loop through each path from top to bottom in 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

在感兴趣的分隔符上拆分它,然后遍历每个切片大小:

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

或者,如果您想要字符串而不是 lists,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

从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)

一个one-liner:

>>> [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']