Удалить целое число в списке, если оно меньше предыдущего целого числа в списке - PullRequest
0 голосов
/ 08 июля 2019

У меня есть неупорядоченный список номеров

num_list=[3 4 5 1 2 5 6 3 1 2 6 9]

Я хочу пробежаться по списку и удалить все числа, которые меньше предыдущих, так что список будет упорядочен в порядке возрастания после удаления таких чисел. Как я могу это сделать?

Ожидаемый результат:

num_list=[3 4 5 5 6 6 9]

Ответы [ 6 ]

4 голосов
/ 08 июля 2019

Один из простых подходов состоит в том, чтобы итеративно добавлять значения из 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]
0 голосов
/ 08 июля 2019

Вот еще одно однострочное решение, использующее 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)
0 голосов
/ 08 июля 2019

Версия с 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]
0 голосов
/ 08 июля 2019

Для этого можно использовать понимание:

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]))

Хотя это не так эффективно, как ответ Яту.

0 голосов
/ 08 июля 2019

Простой подход с использованием 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]
0 голосов
/ 08 июля 2019

Короткий подход с функцией 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...