2010-08-05 88 views
5

或者如何在修改列表中聲明if語句。python中if語句中的生成器

我一直在閱讀StackOverflow一段時間(感謝大家)。我喜歡它。我也看到你可以發表問題並自己回答。對不起,如果我重複,但我沒有在StackOverflow找到這個特殊的答案。


  • 你如何驗證一個元素是一個列表,但修改它在同一時間?

我的問題:

myList = ["Foo", "Bar"] 
if "foo" in myList: 
    print "found!" 

由於我不知道在列表中我想以較低的情況下,列表比較單元的情況。顯而易見的答案是:

myList = ["Foo", "Bar"] 
lowerList = [] 

for item in myList: 
    lowerList.append(item.lower()) 

if "foo" in lowerList: 
    print "found!" 

我可以做得更好嗎?

+4

小點:雖然您可以使用「列表」作爲變量名,你或許不應該因爲這樣做旁白賦予了內置類型的名稱。 – 2010-08-05 22:02:03

+0

好的抓彼得:我其實認爲這是一個溫和的主要觀點。 – 2010-08-05 22:03:10

+0

變了,謝謝! – 2010-08-05 22:12:12

回答

8
if any(s.lower() == "foo" for s in list): print "found" 
+2

注意:任何()都比列表理解稍好,因爲只要找到第一個項目,它就會停止。它也不會創建一次性臨時列表。 – 2010-08-05 22:03:49

+0

用於回答Q爲OP的+1問,使用生成器表達式 – 2010-08-05 22:05:00

+0

我是對的,如果我說你的答案和我的答案是一樣的? – 2010-08-05 22:10:02

1

列表解析:

mylist = ["Foo", "Bar"] 
lowerList = [item.lower() for item in mylist] 

然後,你可以這樣做if "foo" in lowerlist或全部if "foo" in [item.lower() for item in mylist]

0

繞過臨時變量如何:

theList = ["Foo", "Bar"] 
lowerCaseSet = set(x.lower for x in theList) 

if "foo" in lowerCaseSet: 
    print "found" 

BTW。您不應該將您的變量list稱爲此字已由list類型使用。

+0

命名的好處 – 2010-08-05 22:07:27

1

這結合了速度增益發電機表達的內存優點刪除重複:

if "foo" in (s.lower() for s in set(list)): print "found" 
+0

你爲什麼做一組清單? – 2011-02-12 02:16:51

+0

有兩個原因。集合的查找時間爲O(1),而列表的查找時間爲O(n)。生成一個集合還會刪除任何重複的初始數據。 – 2011-02-12 04:06:54

+0

你不在查找任何東西,你只是遍歷它。 – 2011-02-15 21:20:31

0

請不要使用列表作爲變量名,這裏是版本這使發電機變量和演示,那一代找到答案後停止,並沒有用盡發生器:

list_to_search = ["Foo", "Bar"] 
lowergen = (item.lower() for item in list_to_search) 
if "foo" in lowergen: 
    print "found!" 
print next(lowergen), 'is next after it'