筛选list里元素是python经常面临的问题之一,其中元素又主要分为“数字”和“字母”,下面就分别说一下如何筛选list里的元素。
筛选序列中的数字元素
>>> aaa=[1,2,3,4,5,-6,-7,-8,-9,0]
>>> [num for num in aaa if num>0] #提取所有大于零的数
[1,2,3,4,5]
>>> [num for num in aaa if num<=0] #提取所有小于等于零的数
[-6,-7,-8,-9,0]
这样得到的是一个list,如果想要得到一个int,那就
>>> bbb=[num for num in aaa if num>0]
>>> for i in bbb:
print(i)
i就是int。
使用shell通配符进行字母匹配
筛选字母就要用到fnmatch模块,这个模块可以让python认可类似linux的正则表达式。fnmatch模块不仅在3.5好使,在2.6也是自带的。
>>> import fnmatch
>>> a=["james","wade","yaoming","kevin","rose","kobe"]
>>> fnmatch.filter(a,"james") #完全匹配a字符串里的james
['james']
>>> fnmatch.filter(a,"*e") #匹配a字符串里以e结尾的单词
['wade', 'rose', 'kobe']
>>> fnmatch.filter(a,"*[en]") #匹配a字符串里以e or n结尾的单词
['wade', 'kevin', 'rose', 'kobe']
>>> fnmatch.filter(a,"*![en]") #错误用法
[]
>>> fnmatch.filter(a,"*[!en]") #匹配a字符串里不是以e or n结尾的单词
['james', 'yaoming']
这里要注意,这里要用import fnmatch,而不是from fnmatch import fnmatch.如果启用了from fnmatch import fnmatch,会提示AttributeError: 'function' object has no attribute 'filter'。
如果用的是类似数字的方法[name for name in a if fnmatch(a,"*e")],会提示:TypeError: normcase() argument must be str or bytes, not 'list'。
如果把a转成str,又提示:AttributeError: 'function' object has no attribute 'filters'。不过有的书说这个方法是好使的,我的机器却不成功,不知道为什么。
如果是数字与字母混搭...
假设aaa=[1,2,3,4,5,"messi","pique","N/A',"-"],要提取所有的数字的话,可以这么写一个小函数。
>>> aaa=[1,2,3,4,5,"messi","pique","N/A","xavi"]
>>> def check_int(x):
try:
num=int(x) #int就是挑出数字的关键词
print(num)
except ValueError:
return False
>>> nums=list(filter(check_int,aaa))
1
2
3
4
5
这里单独说一下filter函数的用法,filter()里面要有两个参数,一个是定义的函数,另一个是函数作用的list。这两个参数都是必须的,缺一不可。
再举一个例子来说明一下filter()。
>>> aaa=[10,99,25,6,7,784,"格里芬","圣骑士",-8,-34,0]
>>> def guolvhanshu(x):
if x<10 and x>5
return(x)
>>> result=filter(guolvhanshu,aaa) #使用 filter函数,里面的参数是guolvhanshu和aaa
>>> list(result) #如果是python2.6,可以直接print result
[6,7]
不熟悉python 3.5的迭代器可以看:http://zhidao.baidu.com/link?url=5ONk1itSIxSv9C9E506oV04NJPSs6LY0Atz0YZujd9gsE5_MBxmcsRp7gB2AimDF7UHJXngAOetzcRnh3bGbn7tZJtR_jjMPBPhQJ6mpwrq
转载于:https://blog.51cto.com/chenx1242/1767197