2

Pythonはこのような短い形式の構文でマルチサブパスを持つパスを生成できますか?

vars=project/{DEBIAN,usr/{bin,usr/{applications,icons,share}},computer}
4

3 に答える 3

1

通常、私は次のようなものを使用することを提案したでしょう

def extend(base, *others):
    [base + o for o in others] if others else [base]

そしてします

 extend("project", "/debian", *extend("/usr", *(extend("/bin") + extend("/usr", "/applications", "/icons", "/share"))))

。しかし、文字列の解析を好むので、私は別の方法を提供しようとします。

def commasplit(s):
    start = 0
    level = 0
    for i, c in enumerate(s):
        if c == '{':
            level += 1
        elif c == '}':
            level -= 1
        elif c == ',' and level == 0:
            yield s[start:i]
            start = i+1
    yield s[start:]

def split(s):
    import re
    found = False
    for m in re.finditer("(\{.*\})",s):
        found = True
        for p in commasplit(s[m.start() + 1:m.end() - 1]):
            for i in split(p):
                yield s[:m.start()] + i + s[m.end():]
    if not found:
        yield s

cs = "a,b,c,{d,e,f},g"
print list(commasplit(cs)) # -> seems to work

s = "project/{DEBIAN,usr/{bin,usr/{applications,icons,share}},computer}"
print s
for n, i in enumerate(split(s)): print n, i # ->  as well.
于 2012-10-21T07:35:53.530 に答える
1

いいえ、そのような組み込みの速記はありません。合理的にpythonicな方法は次のようになります:

vars = ["project" + path for path in (
    ["/DEBIAN"] +
    ["/usr" + path for path in (
        ['/bin'] +
        ['/usr' +  path for path in [
            "/applications",
            "/icons",
            "/share"]
        ]
    )] +
    ['/computer']
)]

編集:

これを簡単にする関数を定義できます。レイジージェネレータバージョンは次のとおりです。

def expand(base, paths):
    for path in paths:
        if type(path) == str:
            yield base + path
        else:
            for p in path:
                yield base + p

vars = expand("project", [
    "/debian",
    expand("/usr", [
        "/bin",
        expand("/usr", [
            "/applications",
            "/icons",
            "/share"
        ]),
        "/computer"
    ])
])
于 2012-10-20T23:22:10.787 に答える
0

ありがとうございました。

私は自分のコードを書こうとしています。

私はいつも["0,1,2,3,4,5,6,7,8,9".split( "、")、["a、b、c、d、e" .split( "、 ")]]通常のリストの代わりに。

なぜなら、シフトプレスなしで、明らかに、["x"、 "y"、"z"]よりも高速だからです。

だから、私はいくつかの文字列メソッドがコードの下で、Pythonでbashのように動作できるようになることを願っています...

Python構文:project、[DEBIAN、usr、[bin、usr、[applications、icons、share / winpath]]、computer]

Bash構文:project / {DEBIAN、usr / {bin、usr / {applications、icons、share}}、computer}

import re
def genpaths (multils, root=""):
    suc=[]
    for l in multils:
        if type(l) == type([]):
            suc.extend(genpaths (l, root+multils[multils.index(l)-1]+"/"))
        else: 
            suc.append( root+l)
    return filter(None, suc)

def easylist (s):
    s=eval("['''"+re.sub("(\]+)(''',''')?", "'''\\1,'''",re.sub("(''',''')?(\[+)","''',\\2'''",re.sub(",","''','''",s)))+"''']")
    return s

def bashlist (s):
    s=eval("['''"+re.sub("(\}+)(''',''')?", "'''\\1,'''",re.sub("(/)?(\{+)","''',\\2'''",re.sub(",","''','''",s))).replace("{","[").replace("}","]")+"''']")
    return s

def pythonGenPath (s):
    return genpaths(bashlist (s))

def bashGenPath (s):
    return genpaths(bashlist (s))

#testing
print pythonGenPath ("project,[DEBIAN,usr,[bin,usr,[applications,icons,share/winpath]],computer]")
print bashGenPath ("project/{DEBIAN,usr/{bin,usr/{applications,icons,share}},computer}")

結果は:

['project', 'project/DEBIAN', 'project/usr', 'project/usr/bin', 'project/usr/usr', 'project/usr/usr/applications', 'project/usr/usr/icons', 'project/usr/usr/share', 'project/computer']
于 2012-10-21T06:24:37.247 に答える