例:
L = [12,14,22,41,21,23]
結果は次のようになります。
R == [12,14,22,23]
数字の桁は昇順である必要があります。以下は私の解決策であり、どちらも機能しますが、どちらも遅すぎます。
それをソートする最速の方法は何ですか?
解決策1:
R = filter(lambda j: int(''.join(sorted(str(j))))==j , L)
解決策2:
for j in L:
if int(''.join(sorted(str(j))))==j:
R.append(j)
質問2-さらに、これらの対応する数字を合計して5に等しいものが必要です。
これが私の解決策です。繰り返しますが、機能しますが、遅すぎます。
それで、それを行う最も速い方法は何ですか。
newR_should_be == [14,23]
1:
newR = filter(lambda i: sum([int(x) for x in str(i)])==5 ,R)
二:
for i in R:
if sum([int(x) for x in str(i)])==5:
newR.append(i)
どんな助けでもいただければ幸いです。
OlivierMelançonソリューションは非常にエレガントです。ただし、少し醜いコードを記述したい場合は、文字列変換を回避し、両方のテストを同時に実行することで、コードをかなり高速に実行できます。私はあなたのソリューションast1、OlivierMelançonをt2として実装し、私のソリューションをt3として実装しました。
def FastFilter(n):
x = n % 10
s = x
n //= 10
while n:
y = n % 10
s += y
if (x < y):
return False
x = y;
n //= 10
return s==5
def sort_by_digits(l):
return sorted(set(int(''.join(sorted(str(x)))) for x in l))
def filter_by_sum(l, total=5):
return [x for x in map(str, l) if sum(map(int, x)) == total]
def t1(L):
R = filter(lambda j: int(''.join(sorted(str(j))))==j , L)
newR = filter(lambda i: sum([int(x) for x in str(i)])==5 ,R)
return sorted(newR)
def t2(l):
return sort_by_digits(filter_by_sum(l))
def t3(l):
return sorted(filter(FastFilter, l))
l = [12, 14, 22, 41, 21, 23]
%timeit t1(l)
%timeit t2(l)
%timeit t3(l)
与える
11.2 µs ± 24.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
8.88 µs ± 24.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
2.71 µs ± 12.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加