Повернути список елементів у списку, який перевищує деяке значення


76

У мене є такий список

j=[4,5,6,7,1,3,7,5]

Який найпростіший спосіб повернути [5,5,6,7,7]елементи в j, більші або рівні 5?


2
і що буде найшвидшим?
Орен

точно не слід сортувати їх перед фільтруванням. Оскільки це сильно уповільнить. Натомість починайте його фільтрувати, а потім відсортуйте результат, якщо вам потрібно це відсортувати
П’єтро Спероні

Відповіді:


107

Для фільтрування можна використовувати розуміння списку:

j2 = [i for i in j if i >= 5]

Якщо ви дійсно хочете, щоб він був відсортований, як у вашому прикладі, ви можете використовувати sorted:

j2 = sorted(i for i in j if i >= 5)

або зателефонуйте sortдо остаточного списку:

j2 = [i for i in j if i >= 5]
j2.sort()

Я не знав про синтаксис де, приємно!
ismail

3
@ İsmail 'cartman' Dönmez: Це, мабуть, тому, що це SyntaxError :)
Тім Пітцкер

@Ismail Це насправді if, я просто з глузду з'їхав , коли писав цю відповідь :). Я радий, що ви залишили цей коментар, інакше я, мабуть, цього не помітив би
Michael Mrozek

Не потрібно використовувати розуміння списку, коли ви все sortedодно збираєтеся його подавати . Сподіваємось, ви знаєте вирази генератора і просто забудете, наскільки добре вони застосовуються в цьому випадку;)

1
@Michael, це було б непоганим доповненням! :)
ismail

14

Розуміння списку - це простий підхід:

j2 = [x for x in j if x >= 5]

В якості альтернативи ви можете використовувати filterдля абсолютно однакового результату:

j2 = filter(lambda x: x >= 5, j)

Зверніть увагу, що оригінальний список jне модифікований.


12

Ви можете використовувати розуміння списку:

[x for x in j if x >= 5]

2

Використання filter(коротка версія, не виконуючи функції lambda, використовуючи __le__):

j2 = filter((5).__le__, j)

Приклад (python 3):

>>> j=[4,5,6,7,1,3,7,5]
>>> j2 = filter((5).__le__, j)
>>> j2
<filter object at 0x000000955D16DC18>
>>> list(j2)
[5, 6, 7, 7, 5]
>>> 

Приклад (python 2):

>>> j=[4,5,6,7,1,3,7,5]
>>> j2 = filter((5).__le__, j)
>>> j2
[5, 6, 7, 7, 5]
>>>

Використовуйте __le__я рекомендую це, це дуже просто, __le__це ваш друг

Якщо ви хочете відсортувати його до бажаного результату (обидві версії):

>>> j=[4,5,6,7,1,3,7,5]
>>> j2 = filter((5).__le__, j)
>>> sorted(j2)
[5, 5, 6, 7, 7]
>>> 

Використовуйте sorted

Час:

>>> from timeit import timeit
>>> timeit(lambda: [i for i in j if i >= 5]) # Michael Mrozek
1.4558496298222325
>>> timeit(lambda: filter(lambda x: x >= 5, j)) # Justin Ardini
0.693048732089828
>>> timeit(lambda: filter((5).__le__, j)) # Mine
0.714461565831428
>>> 

Тож Джастін перемагає !!

З number=1:

>>> from timeit import timeit
>>> timeit(lambda: [i for i in j if i >= 5],number=1) # Michael Mrozek
1.642193421957927e-05
>>> timeit(lambda: filter(lambda x: x >= 5, j),number=1) # Justin Ardini
3.421236300482633e-06
>>> timeit(lambda: filter((5).__le__, j),number=1) # Mine
1.8474676011237534e-05
>>> 

Тож Майкл перемагає !!

>>> from timeit import timeit
>>> timeit(lambda: [i for i in j if i >= 5],number=10) # Michael Mrozek
4.721306089550126e-05
>>> timeit(lambda: filter(lambda x: x >= 5, j),number=10) # Justin Ardini
1.0947956184281793e-05
>>> timeit(lambda: filter((5).__le__, j),number=10) # Mine
1.5053439710754901e-05
>>> 

Тож Джастін знову перемагає !!


Думаю, Джастін переміг і на другому. 1,6 * 10 ^ -5 більше, ніж 3,4 * 10 ^ -6.
Назмус Сакіб АбІР

1

Оскільки бажаний результат сортується, вам також потрібно його відсортувати:

>>> j=[4, 5, 6, 7, 1, 3, 7, 5]
>>> sorted(x for x in j if x >= 5)
[5, 5, 6, 7, 7]

1

Якщо ви плануєте використовувати numpyмодуль, це робить це завдання дуже простим, як вимагається:

import numpy as np

j = np.array([4, 5, 6, 7, 1, 3, 7, 5])

j2 = np.sort(j[j >= 5])

Код усередині дужок, j >= 5створює список Trueабо Falseзначення, які потім служать індексами для вибору потрібних значень у j. Нарешті, сортуємо за допомогою sortвбудованої функції numpy.

Тестований результат ( numpyмасив):

array([5, 5, 6, 7, 7])

0

Є інший спосіб,

j3 = j2 > 4; print(j2[j3])

перевірено в 3.x


Це справді працює? Я отримавTypeError: '>' not supported between instances of 'list' and 'int'
Mikhail_Sam
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.