python - 排序/过滤/求和列表中递增数字的最快方法是什么

标签 python algorithm list sorting

例子:

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/

相关文章:

python - 查找列表中项目的平均长度。 Python

python - 使用python从网页中提取信息

python - cv2:[WARN:0]全局cap_msmf.cpp(674)SourceReaderCB::~~ SourceReaderCB终止异步回调

python - 使用Python与类的子集总和

algorithm - 施特拉森矩阵乘法

java - 要求用户创建一个新对象?

python - 以 root 身份运行 Python 脚本(使用 sudo)——有效用户的用户名是什么?

python - django send_mail 来自查询集

algorithm - 在网格中查找从单元格 x 到单元格 y 的路径,以便所有单元格都被解析一次

r - 使用三点参数时的 list(...) 与 as.list(...)