2010-01-13 29 views
1
thelist = [{'color':'green', 'time':4}, {'color':'red','time':2},{'color':'blue','time':5}] 

我怎麼說:如何確定元素是否在列表中?

If "red" is in thelist and time does not equal 2 for that element (that's we just got from the list): 
+0

是否有「wallacoloo」的回答和列表理解/ Python的答案之間的速度差異? – TIMEX 2010-01-13 00:28:43

回答

13

使用any(),以找出是否有滿足條件的元素:

>>> any(item['color'] == 'red' and item['time'] != 2 for item in thelist) 
False 
+0

這很好!我是否正確理解any()的括號是作爲生成器加倍的,因此any()會逐項評估列表理解,一旦找到滿足條件的項目,將返回True。 – Ben 2010-01-13 00:37:17

+1

這是一個「生成器表達式」,可用於合理的Python版本(自2.4開始)。也可以寫'任何([...])'來獲得經典的列表理解。 (有關生成器表達式的更多信息,請參閱http://www.python.org/dev/peps/pep-0289/) – sth 2010-01-13 00:42:13

+0

這就是那種讓我愛Python的東西。 – orokusaki 2010-01-13 00:49:10

1
def colorRedAndTimeNotEqualTo2(thelist): 
    for i in thelist: 
     if i["color"] == "red" and i["time"] != 2: 
      return True 
    return False 

print colorRedAndTimeNotEqualTo2([{'color':'green', 'time':4}, {'color':'red','time':2},{'color':'blue','time':5}]) 

因爲我在通過的thelist的thelist迭代,分配當前元素我和塊做代碼的其餘部分(每個i的值)

非常感謝Benson。

+0

毆打30秒 - 這正是我要做的。除了,只是在Python 3習慣:print(i) – Ben 2010-01-13 00:24:01

+1

這是可行的,但使用for循環意味着,如果有多個元素的顏色==紅色和時間!= 2,你會得到我印兩次。 – Benson 2010-01-13 00:28:55

0

你可以在列表理解中完成大部分列表操作。這是一個爲所有顏色爲紅色的元素列出時間的列表。那麼你可以問在這些時候是否存在2。

thelist = [{'color':'green', 'time':4}, {'color':'red','time':2},{'color':'blue','time':5}] 
reds = (x['time'] == 2 for x in thelist if x['color'] == red) 
if False in reds: 
    do_stuff() 

您可以通過消除變量「紅魔」像這樣進一步凝聚的是:

thelist = [{'color':'green', 'time':4}, {'color':'red','time':2},{'color':'blue','time':5}] 
if False in (x['time'] == 2 for x in thelist if x['color'] == red): 
    do_stuff() 
+0

這需要2次搜索而不是1次(一次獲取元素,另一次找到False)。這也需要更多的內存(列表理解可能會產生巨大的結果)。迭代會更有效 – jspcal 2010-01-13 21:53:12

+0

我轉而使用生成器解析而不是列表解析,因爲(如jspcal所說)列表是不必要的。 – Benson 2010-01-14 23:22:54

0

嘛,沒有什麼是優雅的「發現」,但你可以使用列表理解:

matches = [x for x in thelist if x["color"] == "red" and x["time"] != 2] 
if len(matches): 
    m = matches[0] 
    # do something with m 

但是,我發現[0]和len()單調乏味。我經常使用一個for循環利用陣列片,如:

matches = [x for x in thelist if x["color"] == "red" and x["time"] != 2] 
for m in matches[:1]: 
    # do something with m 
+0

我假設一個「最多一個」類型的發現。如果你想要所有的比賽,我會推遲到別人的回答。 – jpsimons 2010-01-13 00:27:15

0
list = [{'color':'green', 'time':4}, {'color':'red','time':2},{'color':'blue','time':5}] 
for i in list: 
    if i['color'] == 'red' && i['time'] != 2: 
    print i 
+0

也許這太挑剔了,但我建議你避免命名事物「list」,因爲你可能在某些時候需要訪問列表構造函數,並且覆蓋它會是一件恥辱。 – Benson 2010-01-13 21:20:55

+0

Python使用「和」而不是「&&」 – Ponkadoodle 2010-03-25 22:26:56

0
for val in thelist: 
    if val['color'] == 'red' and val['time'] != 2: 
     #do something here 

但它看起來並不像那使用正確的數據結構。

相關問題