Pythonで数字の2桁を交換する最速の方法は何ですか? 数字は文字列として与えられているので、
string[j] = string[j] ^ string[j+1]
string[j+1] = string[j] ^ string[j+1]
string[j] = string[j] ^ string[j+1]
私が見たものはすべて、C で作成するよりもはるかにコストがかかり、リストを作成してからリストを元に戻すか、その変種に変換する必要があります。
Pythonで数字の2桁を交換する最速の方法は何ですか? 数字は文字列として与えられているので、
string[j] = string[j] ^ string[j+1]
string[j+1] = string[j] ^ string[j+1]
string[j] = string[j] ^ string[j+1]
私が見たものはすべて、C で作成するよりもはるかにコストがかかり、リストを作成してからリストを元に戻すか、その変種に変換する必要があります。
これは、少なくとも私のタイミング テストでの Jon Clements の現在の回答よりも高速です。
i, j = (i, j) if i < j else (j, i) # make sure i < j
s = s[:i] + s[j] + s[i+1:j] + s[i] + s[j+1:]
得られた他の回答を比較したい場合は、ここに私のテストベッドを示します。
import timeit
import types
N = 10000
R = 3
SUFFIX = '_test'
SUFFIX_LEN = len(SUFFIX)
def setup():
import random
global s, i, j
s = 'abcdefghijklmnopqrstuvwxyz'
i = random.randrange(len(s))
while True:
j = random.randrange(len(s))
if i != j: break
def swapchars_martineau(s, i, j):
i, j = (i, j) if i < j else (j, i) # make sure i < j
return s[:i] + s[j] + s[i+1:j] + s[i] + s[j+1:]
def swapchars_martineau_test():
global s, i, j
swapchars_martineau(s, i, j)
def swapchars_clements(text, fst, snd):
ba = bytearray(text)
ba[fst], ba[snd] = ba[snd], ba[fst]
return str(ba)
def swapchars_clements_test():
global s, i, j
swapchars_clements(s, i, j)
# find all the functions named *SUFFIX in the global namespace
funcs = tuple(value for id,value in globals().items()
if id.endswith(SUFFIX) and type(value) is types.FunctionType)
# run the timing tests and collect results
timings = [(f.func_name[:-SUFFIX_LEN],
min(timeit.repeat(f, setup=setup, repeat=R, number=N))
) for f in funcs]
timings.sort(key=lambda x: x[1]) # sort by speed
fastest = timings[0][1] # time fastest one took to run
longest = max(len(t[0]) for t in timings) # len of longest func name (w/o suffix)
print 'fastest to slowest *_test() function timings:\n' \
' {:,d} chars, {:,d} timeit calls, best of {:d}\n'.format(len(s), N, R)
def times_slower(speed, fastest):
return speed/fastest - 1.0
for i in timings:
print "{0:>{width}}{suffix}() : {1:.4f} ({2:.2f} times slower)".format(
i[0], i[1], times_slower(i[1], fastest), width=longest, suffix=SUFFIX)
補遺:
文字列として指定された正の 10 進数で数字文字を交換する特殊なケースでは、以下も機能し、私の回答の上部にある一般的なバージョンよりも少し高速です。
メソッドを使用して最後に文字列に戻すやや複雑な変換format()
は、ゼロが文字列の前に移動した場合に対処するためです。それが何をするのかを数学的に把握しないとかなり理解できないので、主に好奇心として提示します。また、負の数も処理しません。
n = int(s)
len_s = len(s)
ord_0 = ord('0')
di = ord(s[i])-ord_0
dj = ord(s[j])-ord_0
pi = 10**(len_s-(i+1))
pj = 10**(len_s-(j+1))
s = '{:0{width}d}'.format(n + (dj-di)*pi + (di-dj)*pj, width=len_s)
それはある種の可変型でなければなりません、私が考えることができる最高のものは(パフォーマンスに関しては何の主張もできません):
def swapchar(text, fst, snd):
ba = bytearray(text)
ba[fst], ba[snd] = ba[snd], ba[fst]
return ba
>>> swapchar('thequickbrownfox', 3, 7)
bytearray(b'thekuicqbrownfox')
str
結果を/ -として利用することも、必要に応じlist
て明示的に変換することもstr
できます。
私はあなたがすでに答えを受け入れていることを知っているので、わざわざPythonでコーディングするつもりはありませんが、不変の文字列を持つJavaScriptでそれを行う方法は次のとおりです。
function swapchar(string, j)
{
return string.replace(RegExp("(.{" + j + "})(.)(.)"), "$1$3$2");
}
明らかにj
適切な範囲にない場合は、元の文字列を返します。
>>> int1 = 2
>>> int2 = 3
>>> eval(str(int1)+str(int2))
23