Понимание подробного списка в Python - PullRequest
0 голосов
/ 22 сентября 2009

У меня есть список целых чисел, и я хочу создать новый список, в котором все элементы меньше указанного предела.

a=range(15) #example list
limit=9 #example limit

Мой подход к решению этой проблемы был

[i for i in a if i < limit]

Для меня начало «я для себя» выглядит довольно многословно. Есть ли в Python реализация лучше ?

Ответы [ 4 ]

4 голосов
/ 22 сентября 2009

Вы можете использовать фильтр

>>> filter(lambda i: i < limit, a)
[0, 1, 2, 3, 4, 5, 6, 7, 8]

Но списки - предпочтительный способ сделать это

Вот что Python Docs может сказать по этому поводу:

Список представлений дает краткое способ создания списков без обращения использовать map (), filter () и / или лямбда. Результирующее определение списка часто бывает понятнее списков построен с использованием этих конструкций.

2 голосов
/ 22 сентября 2009

Это самое лучшее, что вы можете сделать. Возможно, вам удастся добиться большего успеха с помощью фильтра, но я бы не стал его рекомендовать. Имейте в виду, что понимание списка выглядит почти так же, как на английском: «я за я, если я <предел». Это значительно облегчает чтение и понимание, если немного на многословной стороне. </p>

1 голос
/ 22 сентября 2009

Вы можете использовать filter () (по крайней мере, в серии Python 2.x ... Я думаю, что он мог быть удален в 3.0)

newlist = filter(lambda item: item < limit, oldlist)

Первый аргумент может быть любым вызываемым (его результат будет приведен к логическому, поэтому лучше использовать вызываемый, который в любом случае возвращает логическое значение), а вторым аргументом может быть любая последовательность.

0 голосов
/ 22 сентября 2009

Для более хороших версий требуется стандартный код, поэтому понимание списка настолько приятно, насколько вы можете получить.

Это был бы другой способ сделать это:

from operator import ge
from functools import partial

filter(partial(ge, limit), a)

(Но если бы вы использовали filter, путь Нади был бы очевидным способом сделать это)

...