筛选list里元素是python经常面临的问题之一,其中元素又主要分为“数字”和“字母”,下面就分别说一下如何筛选list里的元素。
筛选序列中的数字元素
1
2
3
4
5
<code>>>> aaa</code><code>=</code><code>[</code><code>1</code><code>,</code><code>2</code><code>,</code><code>3</code><code>,</code><code>4</code><code>,</code><code>5</code><code>,</code><code>-</code><code>6</code><code>,</code><code>-</code><code>7</code><code>,</code><code>-</code><code>8</code><code>,</code><code>-</code><code>9</code><code>,</code><code>0</code><code>]</code>
<code>>>> [num </code><code>for</code> <code>num </code><code>in</code> <code>aaa </code><code>if</code> <code>num></code><code>0</code><code>] </code><code>#提取所有大于零的数</code>
<code>[</code><code>1</code><code>,</code><code>2</code><code>,</code><code>3</code><code>,</code><code>4</code><code>,</code><code>5</code><code>]</code>
<code>>>> [num </code><code>for</code> <code>num </code><code>in</code> <code>aaa </code><code>if</code> <code>num<</code><code>=</code><code>0</code><code>] </code><code>#提取所有小于等于零的数</code>
<code>[</code><code>-</code><code>6</code><code>,</code><code>-</code><code>7</code><code>,</code><code>-</code><code>8</code><code>,</code><code>-</code><code>9</code><code>,</code><code>0</code><code>]</code>
这样得到的是一个list,如果想要得到一个int,那就
<code>>>> bbb</code><code>=</code><code>[num </code><code>for</code> <code>num </code><code>in</code> <code>aaa </code><code>if</code> <code>num></code><code>0</code><code>]</code>
<code>>>> </code><code>for</code> <code>i </code><code>in</code> <code>bbb:</code>
<code> </code><code>print</code><code>(i)</code>
i就是int。
使用shell通配符进行字母匹配
筛选字母就要用到fnmatch模块,这个模块可以让python认可类似linux的正则表达式。fnmatch模块不仅在3.5好使,在2.6也是自带的。
6
7
8
9
10
11
12
<code>>>> </code><code>import</code> <code>fnmatch</code>
<code>>>> a</code><code>=</code><code>[</code><code>"james"</code><code>,</code><code>"wade"</code><code>,</code><code>"yaoming"</code><code>,</code><code>"kevin"</code><code>,</code><code>"rose"</code><code>,</code><code>"kobe"</code><code>]</code>
<code>>>> fnmatch.</code><code>filter</code><code>(a,</code><code>"james"</code><code>) </code><code>#完全匹配a字符串里的james</code>
<code>[</code><code>'james'</code><code>]</code>
<code>>>> fnmatch.</code><code>filter</code><code>(a,</code><code>"*e"</code><code>) </code><code>#匹配a字符串里以e结尾的单词</code>
<code>[</code><code>'wade'</code><code>, </code><code>'rose'</code><code>, </code><code>'kobe'</code><code>]</code>
<code>>>> fnmatch.</code><code>filter</code><code>(a,</code><code>"*[en]"</code><code>) </code><code>#匹配a字符串里以e or n结尾的单词</code>
<code>[</code><code>'wade'</code><code>, </code><code>'kevin'</code><code>, </code><code>'rose'</code><code>, </code><code>'kobe'</code><code>] </code>
<code>>>> fnmatch.</code><code>filter</code><code>(a,</code><code>"*![en]"</code><code>) </code><code>#错误用法 </code>
<code>[] </code>
<code>>>> fnmatch.</code><code>filter</code><code>(a,</code><code>"*[!en]"</code><code>) </code><code>#匹配a字符串里不是以e or n结尾的单词</code>
<code>[</code><code>'james'</code><code>, </code><code>'yaoming'</code><code>]</code>
这里要注意,这里要用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',"-"],要提取所有的数字的话,可以这么写一个小函数。
13
14
<code>>>> aaa</code><code>=</code><code>[</code><code>1</code><code>,</code><code>2</code><code>,</code><code>3</code><code>,</code><code>4</code><code>,</code><code>5</code><code>,</code><code>"messi"</code><code>,</code><code>"pique"</code><code>,</code><code>"N/A"</code><code>,</code><code>"xavi"</code><code>]</code>
<code>>>> </code><code>def</code> <code>check_int(x):</code>
<code> </code><code>try</code><code>:</code>
<code> </code><code>num</code><code>=</code><code>int</code><code>(x) </code><code>#int就是挑出数字的关键词</code>
<code> </code><code>print</code><code>(num)</code>
<code> </code><code>except</code> <code>ValueError:</code>
<code> </code><code>return</code> <code>False</code>
<code> </code>
<code>>>> nums</code><code>=</code><code>list</code><code>(</code><code>filter</code><code>(check_int,aaa))</code>
<code>1</code>
<code>2</code>
<code>3</code>
<code>4</code>
<code>5</code>
这里单独说一下filter函数的用法,filter()里面要有两个参数,一个是定义的函数,另一个是函数作用的list。这两个参数都是必须的,缺一不可。
再举一个例子来说明一下filter()。
<code>>>> aaa</code><code>=</code><code>[</code><code>10</code><code>,</code><code>99</code><code>,</code><code>25</code><code>,</code><code>6</code><code>,</code><code>7</code><code>,</code><code>784</code><code>,</code><code>"格里芬"</code><code>,</code><code>"圣骑士"</code><code>,</code><code>-</code><code>8</code><code>,</code><code>-</code><code>34</code><code>,</code><code>0</code><code>]</code>
<code>>>> </code><code>def</code> <code>guolvhanshu(x):</code>
<code> </code><code>if</code> <code>x<</code><code>10</code> <code>and</code> <code>x></code><code>5</code>
<code> </code><code>return</code><code>(x)</code>
<code>>>> result</code><code>=</code><code>filter</code><code>(guolvhanshu,aaa) </code><code>#使用 filter函数,里面的参数是guolvhanshu和aaa</code>
<code>>>> </code><code>list</code><code>(result) </code><code>#如果是python2.6,可以直接print result</code>
<code> </code><code>[</code><code>6</code><code>,</code><code>7</code><code>]</code>
不熟悉python 3.5的迭代器可以看:http://zhidao.baidu.com/link?url=5ONk1itSIxSv9C9E506oV04NJPSs6LY0Atz0YZujd9gsE5_MBxmcsRp7gB2AimDF7UHJXngAOetzcRnh3bGbn7tZJtR_jjMPBPhQJ6mpwrq
本文转自 苏幕遮618 51CTO博客,原文链接:http://blog.51cto.com/chenx1242/1767197