如何在Python中筛选列表中的项?

14 投票
3 回答
26951 浏览
提问于 2025-04-15 13:47

我有一些数据,是从软件包依赖列表中简单收集来的。

依赖项: foo bar baz >= 5.2

最后我得到了

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

我不想要数字和运算符。

在Perl中,我会这样做:

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

但是我找不到办法,比如说,给remove()传一个lambda函数,或者别的什么。

我找到的最接近的办法有点丑:

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

这样可以让我知道我想要的值从这个集合中是哪一些……前提是这个集合的顺序是可以重复的?我知道在Perl的哈希表中并不是这样。

我知道怎么遍历这些数据。:) 我想用Python那种“正确的方式”来做。

3 个回答

1

关于使用过滤函数

在这个例子中,我们想要从 list_1 中只保留偶数。

 list_1 = [1, 2, 3, 4, 5]
 filtered_list = filter(lambda x : x%2 == 0, list_1)
 print(list(filtered_list))

这段代码会输出一个新列表,里面只包含 list_1 中的偶数。

2

怎么样呢

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

这样可以让你得到你想要的值,返回到 d 中(顺序可能会不同,但这就是使用集合的代价)。

28

这里不需要用到正则表达式。可以直接使用 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中并不是所有情况都需要用列表推导式,但每当我建议使用 mapfilter 的时候,总会看到别人皱眉头。

撰写回答