筛选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