天天看點

數字比對和字元串比對

篩選list裡元素是python經常面臨的問題之一,其中元素又主要分為“數字”和“字母”,下面就分别說一下如何篩選list裡的元素。

篩選序列中的數字元素

1

2

3

4

5

<code>&gt;&gt;&gt; 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>&gt;&gt;&gt; [num </code><code>for</code> <code>num </code><code>in</code> <code>aaa </code><code>if</code> <code>num&gt;</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>&gt;&gt;&gt; [num </code><code>for</code> <code>num </code><code>in</code> <code>aaa </code><code>if</code> <code>num&lt;</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>&gt;&gt;&gt; bbb</code><code>=</code><code>[num </code><code>for</code> <code>num </code><code>in</code> <code>aaa </code><code>if</code> <code>num&gt;</code><code>0</code><code>]</code>

<code>&gt;&gt;&gt; </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>&gt;&gt;&gt; </code><code>import</code> <code>fnmatch</code>

<code>&gt;&gt;&gt; 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>&gt;&gt;&gt; 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>&gt;&gt;&gt; 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>&gt;&gt;&gt; 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>&gt;&gt;&gt; fnmatch.</code><code>filter</code><code>(a,</code><code>"*![en]"</code><code>)      </code><code>#錯誤用法  </code>

<code>[] </code>

<code>&gt;&gt;&gt; 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>&gt;&gt;&gt; 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>&gt;&gt;&gt; </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>&gt;&gt;&gt; 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>&gt;&gt;&gt; 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>&gt;&gt;&gt; </code><code>def</code> <code>guolvhanshu(x):</code>

<code>        </code><code>if</code> <code>x&lt;</code><code>10</code> <code>and</code> <code>x&gt;</code><code>5</code>

<code>            </code><code>return</code><code>(x)</code>

<code>&gt;&gt;&gt; result</code><code>=</code><code>filter</code><code>(guolvhanshu,aaa)    </code><code>#使用 filter函數,裡面的參數是guolvhanshu和aaa</code>

<code>&gt;&gt;&gt; </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