筛选list里元素是python经常面临的问题之一,其中元素又主要分为“数字”和“字母”,下面就分别说一下如何筛选list里的元素。
筛选序列中的数字元素
1
2
3
4
5
|
>>> 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,那就
1
2
3
|
>>> 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也是自带的。
1
2
3
4
5
6
7
8
9
10
11
12
|
>>>
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',"-"],要提取所有的数字的话,可以这么写一个小函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
>>> 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()。
1
2
3
4
5
6
7
|
>>> 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
本文转自 苏幕遮618 51CTO博客,原文链接:http://blog.51cto.com/chenx1242/1767197