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

使用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 に答える
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 に答える
1

grouper() からレシピを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()

于 2013-02-04T17:46:05.427 に答える