1

假设我有一条路径,例如/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)]

我知道我可以以愚蠢的方式做到这一点,但是有没有一种简单的方法来拆分和配对奇数长度的数组?

4

3 回答 3

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)]
于 2013-02-04T17:51:07.343 回答
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))
于 2013-02-04T17:44:33.750 回答
1

查看来自的grouper() recipieitertools

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

于 2013-02-04T17:46:05.427 回答