假设我有/resource/123/resourceb/b/someotherresource/
这样的路径。在这种情况下,someotherresource
没有资源ID。这个例子有3个资源,但我需要处理1-4个资源之间的任何地方。
什么是pythonic方法将其拆分为[(a,b), (c,d), (e, None)]
示例:
x = '/resource/123/resourceb/b/someotherresource/'
xplit = x.split('/')
>>> [ 'resource', '123', 'resourceb', 'b', 'someotherresource']
import magic
# ideal result
>>> [ ('resource', '123'), ('resourceb', 'b'), ('someotherresource', None)]
我知道我可以用愚蠢的方式做到这一点,但是有一种简单的方法来分割和放弃配对一个奇数长度的数组?
答案 0 :(得分:2)
使用itertools.izip_longest()
和iter
魔法:
import itertools
list(itertools.izip_longest(*[iter(xplit[1:])]*2))
我们从索引1开始,因为前导/
斜杠在开始时为您提供了一个空元素。
或者,在开始和结束时删除斜杠:
list(itertools.izip_longest(*[iter(x.strip('/').split('/'))]*2))
输出:
>>> list(itertools.izip_longest(*[iter(x.strip('/').split('/'))]*2))
[('resource', '123'), ('resourceb', 'b'), ('someotherresource', None)]
以魔法方式结束:
import itertools
def split_to_pairs(path):
path = path.strip('/').split('/')
return list(itertools.izip_longest(*[iter(path)]*2))
答案 1 :(得分:2)
In [24]: x
Out[24]: '/resource/123/resourceb/b/someotherresource/'
In [25]: s = x.strip('/').split('/')
In [26]: zip(s[::2], s[1::2] + [None])
Out[26]: [('resource', '123'), ('resourceb', 'b'), ('someotherresource', None)]
答案 2 :(得分:1)
查看grouper()
recipie from itertools
:
def grouper(n, iterable, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
(在2.x中,zip_longest()
为izip_longest()
)