将数组分组为元组数组 - 奇数长度

时间:2013-02-04 17:42:14

标签: python python-2.7

假设我有/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)]

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

3 个答案:

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