例子:
L = [12,14,22,41,21,23]
我希望结果是:
R == [12,14,22,23]
数字的数字必须按递增顺序排列,以下是我的解决方案,它们都有效,但它们都太慢了。
最快的排序方式是什么?
解决方法一:
R = filter(lambda j: int(''.join(sorted(str(j))))==j , L)
解决方案二:
for j in L:
if int(''.join(sorted(str(j))))==j:
R.append(j)
问题 2 - 另外,我希望这些对应数字相加的和等于 5。
这是我的解决方案,同样,它们确实有效,但速度太慢。
那么最快的方法是什么。
newR_should_be == [14,23]
一个:
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)
如有任何帮助,我们将不胜感激。
最佳答案
Olivier Melançon 的解决方案非常优雅。但是,如果您愿意编写更丑陋的代码,则可以通过避免字符串转换并同时执行这两个测试来使其运行得更快。我实现了您的解决方案 ast1,Olivier Melanç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)
关于python - 排序/过滤/求和列表中递增数字的最快方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49245157/