我有一个无序的数字列表
num_list=[3 4 5 1 2 5 6 3 1 2 6 9]
我想遍历该列表并删除所有小于前一个数字的数字,以便在删除此类数字后按升序对列表进行排序。我该怎么办?
预期输出:
num_list=[3 4 5 5 6 6 9]
答案 0 :(得分:4)
一种简单的方法是将num_list
中的值迭代地添加到新列表中,如果它们满足大于最后一个附加值的条件:
out = [num_list[0]]
for i in num_list[1:]:
if i >= out[-1]:
out.append(i)
print(out)
# [3, 4, 5, 5, 6, 6, 9]
答案 1 :(得分:0)
使用functools.reduce
函数的简短方法:
import functools
num_list = [3,4,5,1,2,5,6,3,1,2,6,9]
res = functools.reduce(lambda x, y: x if y < x[-1] else x + [y],
num_list[1:], [num_list[0]])
print(res)
输出:
[3, 4, 5, 5, 6, 6, 9]
答案 2 :(得分:0)
使用list.pop
num_list = [3, 4, 5, 1, 2, 5, 6, 3, 1, 2, 6, 9]
i = 1
while (i < len(num_list)):
if num_list[i] < num_list[i - 1]:
num_list.pop(i)
else:
i += 1
print(num_list)
# [3, 4, 5, 5, 6, 6, 9]
答案 3 :(得分:0)
对此可以理解:
num_list = [3, 4, 5, 1, 2, 5, 6, 3, 1, 2, 6, 9]
(x for i, x in enumerate(num_list) if all(x >= j for j in num_list[:i]))
尽管它没有Yatu的回答那么有效。
答案 4 :(得分:0)
带有itertools.groupby
的版本:
from itertools import groupby
num_list=[3, 4, 5, 1, 2, 5, 6, 3, 1, 2, 6, 9]
out = [num_list[0]]
[out.extend(g) for v, g in groupby(num_list[1:], lambda k: k>=out[-1]) if v]
print(out)
打印:
[3, 4, 5, 5, 6, 6, 9]
答案 5 :(得分:0)
这是使用itertools.accumulate
的另一种单线解决方案。
from itertools import accumulate
result = [n for n, cur_max in zip(l, accumulate(l, max)) if n >= cur_max]
尽管简洁,但实际上它的效率要比使用显式for
循环的以下解决方案低得多。到目前为止,这也是最有效的解决方案。
cur_max = l[0]
result = []
for e in l:
if e >= cur_max:
cur_max = e
result.append(e)