如何在 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
或者,如果您想要字符串而不是 list
s,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']
给定一个这样的字符串
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
或者,如果您想要字符串而不是 list
s,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']