Как я могу отфильтровать элементы из списка в Python? - PullRequest
10 голосов
/ 22 августа 2009

Я наивно собираю данные из списков зависимостей пакетов.

Зависит от: foo bar baz> = 5.2

Я получаю

 d = set(['foo','bar','baz','>=','5.2'])

Мне не нужны цифры и операнды.

В Perl я бы

@new = grep {/^[a-z]+$/} @old

но я не могу найти способ, например, Pass Remove () лямбда, или что-то.

Самое близкое, что я пришел, уродливо:

[ item != None for item in [ re.search("^[a-zA-Z]+$",atom)   for atom in d] ]

, которая дает мне карту, какие значения из набора я хочу ... если порядок набора повторяется? Я знаю, что это не относится к хешам Perl.

Я знаю, как повторять. :) Я пытаюсь сделать это Pythonesque Right Way

Ответы [ 2 ]

23 голосов
/ 22 августа 2009

Нет необходимости в регулярных выражениях здесь. Используйте str.isalpha. С и без списочных представлений:

my_list = ['foo','bar','baz','>=','5.2']

# With
only_words = [token for token in my_list if token.isalpha()]

# Without
only_words = filter(str.isalpha, my_list)

Лично Я не думаю, что вам нужно использовать понимание списка для всего в Python, но я всегда нахмуриваюсь, когда предлагаю map или filter ответы.

1 голос
/ 22 августа 2009

Как насчет

d = set([item for item in d if re.match("^[a-zA-Z]+$",item)])

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...