2014-02-18 63 views
0

好吧,我是一個Python的完整新手 - 和stackoverflow。我來自ksh和Perl背景。Python 3過濾器 - 錯誤或功能?

在與Python 2.7的交互式會話以下:

 

    Python 2.7.3 (default, Jan 2 2013, 16:53:07) 
    [GCC 4.7.2] on linux2 
    Type "help", "copyright", "credits" or "license" for more information. 
    >>> import re 
    >>> KEY="REC_PAPER" 
    >>> VALIDVALUES=filter(lambda x:re.search(r'^' + KEY + '\=', x), [ 
    ... "REC_METAL=|YES|NO|", 
    ... "REC_PAPER=|YES|NO|", 
    ... "REC_GLASS=|YES|NO|", 
    ... "REC_PLAST=|YES|NO|", 
    ... "DEBUG_FLAG=|0|1|" 
    ... ]) #End general list. 
    >>> print(VALIDVALUES) 
    ['REC_PAPER=|YES|NO|'] 
    >>> 

這是我所期待VALIDVALUES返回。然而,Python的3.2的交互式會話產量完全不同的結果:

 

    Python 3.2.3 (default, Feb 20 2013, 17:02:41) 
    [GCC 4.7.2] on linux2 
    Type "help", "copyright", "credits" or "license" for more information. 
    >>> import re 
    >>> KEY="REC_PAPER" 
    >>> VALIDVALUES=filter(lambda x:re.search(r'^' + KEY + '\=', x), [ 
     ... "REC_METAL=|YES|NO|", 
     ... "REC_PAPER=|YES|NO|", 
     ... "REC_GLASS=|YES|NO|", 
     ... "REC_PLAST=|YES|NO|", 
     ... "DEBUG_FLAG=|0|1|" 
     ... ]) #End general list. 
    >>> print(VALIDVALUES) 
    &ltfilter object at 0xb734268c> 
    >>> 

我已經在好幾個地方(包括計算器)在哪裏見過Python的等價Perl的打擊名單的grep的是過濾列表。這似乎在Python 2中工作。但是,假設Python 3中的上述行爲是「正確的」,似乎不再是這種情況。

第一個問題:上述問題是否是Python 3中的一個bug或功能?

第二個問題:假設它是一個功能,我如何獲得Python 2給出的輸出?由於我不想進入的原因,我想遠離定義一個函數或子程序,並像當前的代碼那樣「內聯」。

我錯過了一些明顯的東西(對於新手來說很可能)?提前致謝。

回答

3

作爲每the documentationfilter在Python 3.x的返回迭代,而不是一個列表作爲在version 2.x。這比預先生成整個列表更具有內存效率。如果你想在名單後面,你可以用迭代器在list()電話:

VALIDVALUES = list(filter(...)) 

或者,如建議What’s New In Python 3.0,你可以把它改寫成列表理解沒有lambda

VALIDVALUES = [x for x in [...] if re.search(r'^' + KEY + '\=', x)] 
+0

這正是我所期待的。謝謝。這是預期的行爲(一個功能),並有一種方法來獲得所需的結果(通過列表())。我有一種感覺,有一塊(如列表()),我錯過了。再次謝謝你。 – user3325543

1

請注意,您通常不需要值列表。您可以直接循環的輸出像下面

for value in VALIDVALUES: 
    do_some_thing(value) 

for value in filter(...): 
    do_some_thing(value) 

有時你可能需要唯一值或非可變值。使用settuplefrozenset而不是list,如other answer所示。