如何在Python中筛选列表中的项?
我有一些数据,是从软件包依赖列表中简单收集来的。
依赖项: 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中并不是所有情况都需要用列表推导式,但每当我建议使用 map
或 filter
的时候,总会看到别人皱眉头。