2

私の主な要件は、文字列のリストにテンプレートを追加し、それらを単一の文字列として結合することです。

def give_str(input_list, template, delimiter="()", joiner=""):
    #Some operation happens here
    return output_string

Input: give_str(["first", "second", "third"], ["count", "rank"], delimiter="()", joiner=",")
Output: "count(rank(first)),count(rank(second)),count(rank(third))"

今、私は次のようなことをしています:

def give_str(input_list, template, delimiter="()", joiner=","):
    output_string = ""
    template_string = delimiter[0].join(template) + delimiter[0]
    item_close = delimiter[-1] * len(template)
    output_string = joiner.join(template_string+item+item_close for item in input_list if item)
    return output_string

これは単純で簡単ですが、複数の文字列を追加することに満足していません. このプロセスを簡素化できる組み込みライブラリ (サードパーティのパッケージをインストールできないため、組み込みのみ) はありますか? という意味での単純化

もう 1 つ暗示されていることは、区切り文字が 1 文字または 2 文字のいずれかであるということです。可能な区切り文字: ","、"|"、"()"、"[]"、...

注: 反対票を投じる場合は、これが役に立たないと考える理由についてコメントしてください。私と将来この質問に来るかもしれない人は、あなたの見解から1つか2つのことを学ぶかもしれません.

4

3 に答える 3

4

よりクリーンなアプローチは、string.templateを使用することです。

>>> from string import Template
>>> def give_str(input_list, template, delimiter="()", joiner=""):
    s = Template("$temp$left$inner$right")
    data = []
    for elem in input_list:
        for t in reversed(template):
            elem = s.substitute(
                temp=t,
                left = delimiter[0],
                right = delimiter[-1],
                inner = elem)
        data.append(elem)
    return joiner.join(data)

>>> give_str(["first", "second", "third"], ["count", "rank"], delimiter="()", joiner=",")
'count(rank(first)),count(rank(second)),count(rank(third))'
>>> give_str(["first", "second", "third"], ["count", "rank"], delimiter="|", joiner=",")
'count|rank|first||,count|rank|second||,count|rank|third||'
于 2013-10-08T09:08:42.303 に答える
1

読みやすさはもちろん主観的です。これは、私が入手できる最も「読みやすい」バージョンです。

def give_str(input_list, template, delimiter="()", joiner=","):
    if len(delimiter) == 2:
        pattern = "TEMPLATE{0}INPUT{1}".format(delimiter[0], delimiter[1])
    else:
        pattern = "TEMPLATE{0}INPUT{0}".format(delimiter)
    final_list = input_list
    for tmp in reversed(template):
        final_list = [pattern.replace("TEMPLATE", tmp).replace("INPUT", x) for x in final_list]
    return joiner.join(final_list)
于 2013-10-08T09:15:05.070 に答える
0

私はあなたが何をしたいのかを完全には理解していませんし、あなたが望むことをするコアライブラリも知りません...非常に効率的にしたい場合は、もちろんCで関数をコーディングして公開することができますPython API (思ったよりずっと簡単です)...

1 と 2 の両方の長さを持つ区切り文字に関して、これはあなたが望むものです:

def give_str(input_list, template, delimiter="()", joiner=","):
    output_string =  item_close = ""
    template_string = delimiter[0].join(template) + delimiter[0]
    if len(delimiter) == 2:
        item_close += delimiter[1] * len(template)
    output_string = joiner.join(template_string+item+item_close for item in input_list if item)
    return output_string

In [10]: give_str(["first", "second", "third"], ["count", "rank"], delimiter="()", joiner=",")
Out[10]: 'count(rank(first)),count(rank(second)),count(rank(third))'

In [11]: give_str(["first", "second", "third"], ["count", "rank"], delimiter=";", joiner=",")
Out[11]: 'count;rank;first,count;rank;second,count;rank;third'

アウトスピードの議論のために(コメントを参照)

In [70]: d = 'd' * (10 **8)
In [71]: c = 'c' * (10 **8)
In [72]: b = 'b' * (10 **8)
In [73]: a = 'a' * (10 **8)


In [92]: %timeit ''.join((a,b,c,d,a,b,c,d,a,b,c,d))
1 loops, best of 3: 778 ms per loop

In [93]: %timeit a+b+c+d+a+b+c+d+a+b+c+d
1 loops, best of 3: 662 ms per loop

私は ''.join が最大 10 倍高速になることを期待しています...しかし、そうではないようです

于 2013-10-08T09:06:40.360 に答える