3

次のような文字列があるとします

'one, two, three,'

「、」「。」に置き換えて反復するpythonicの方法は何ですか 一つずつ?理想的には、関数の戻り値は次のようになります。

['one. two, three,' , 'one, two. three,' , 'one, two, three.']

選択した回答の理由、貢献してくれてありがとう!

import timeit

def one(s):
    b = ["%s.%s" % (s[:i], s[i+1:]) for i, c in enumerate(s) if c == ","]

def two(s):
    b = [s[:i] + "." + s[i+1:] for i in range(len(s)) if s[i] == ","]

def thr(s):
    b = [s[:i] + "." + s[i+1:] for i, c in enumerate(s) if s[i] == ","]

def fou(s):
    ss = s.split(',')
    b = [','.join(ss[:i]) + '.' + ','.join(ss[i:]) for i in range(1,len(ss))]

a = 'one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,'

print(timeit.timeit('one(a)', 'from __main__ import one, a', number = 1000000))
print(timeit.timeit('two(a)', 'from __main__ import two, a', number = 1000000))
print(timeit.timeit('thr(a)', 'from __main__ import thr, a', number = 1000000))
print(timeit.timeit('fou(a)', 'from __main__ import fou, a', number = 1000000))

#   C:\dev\goddangit>python timin.py
#   14.3008527857
#   11.8759967856
#   13.3739626708
#   18.8536401851
4

4 に答える 4

5

ワンライナー、sである'one, two, three,'

>>> [s[:i] + "." + s[i+1:] for i in range(len(s)) if s[i] == ","]
['one. two, three,', 'one, two. three,', 'one, two, three.']

または、最も外側[ ]をで置き換えて、( )代わりにジェネレーター オブジェクトを作成します。

もちろん、これは1 文字の置換のみです。より一般的に部分文字列を他の文字列に置き換えるには、正規表現を使用するなど、他の解決策のいずれかを使用する必要があります。

于 2013-05-22T07:27:09.807 に答える
2
import itertools

l_string = "one, two, three,".rstrip(',').split(',')
separators = lambda pos: [ '.' if i==pos else ',' for i,x in enumerate(l_string) ]
print [ "".join([ "".join(elem) for elem in itertools.izip( l_string, separators(pos)  ) ]) for pos in range(len(l_string)) ]

>>> ['one. two, three,', 'one, two. three,', 'one, two, three.']
于 2013-05-22T07:18:26.027 に答える