假设我有一个像/resource/123/resourceb/b/someotherresource/这样的路径。在这种情况下,someotherresource没有资源id。这个例子有3个资源,但我需要处理1-4个资源之间的任何地方。
将其分割为[(a,b), (c,d), (e, None)]的pythonic方法是什么?
示例:
x = '/resource/123/resourceb/b/someotherresource/'
xplit = x.split('/')
>>> [ 'resource', '123', 'resourceb', 'b', 'someotherresource']
import magic
# ideal result
>>> [ ('resource', '123'), ('resourceb', 'b'), ('someotherresource', None)]我知道我可以用愚蠢的方法来做,但是有没有一种简单的方法来拆分和配对一个奇数长度的数组呢?
发布于 2013-02-05 01:51:07
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)]发布于 2013-02-05 01:44:34
使用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))发布于 2013-02-05 01:46:05
查看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())
https://stackoverflow.com/questions/14692322
复制相似问题