2016-09-30 210 views
-1

我使用列表來存儲屬性的值,這個問題出現了,當我在尋找相同的項目:忽略列表中搜索

l = [['a',1,2],['b',1,2],['c',2,3],['d',1,2]] 
if [any,1,2] in l: 
    print ('blue') 
elif [any,2,3] in l: 
    print('red') 

所需的輸出

blue 

我要的是第一個值被忽略/可以是任何值。 我知道任何函數都不能這樣工作,但是這樣做的正確方法是什麼?

也許這是更容易理解

l = [['a',1,2],['b',1,2],['c',2,3],['d',1,2]] 
for a in range(0,4): 
    if [1,2] == x[1:] for x in l: 
     print ('blue') 
    elif [2,3] == x[1:] for x in l: 
     print('red') 
+0

爲什麼你的輸出會打印3次?它只在您的列表中出現一次。 – Soviut

+0

訂單怎麼樣? –

回答

0

:D實際上設法通過pkacprzak在一行中完成。

l = [['a',1,2],['b',1,2],['c',2,3],['d',1,2]] 
if any(True for x in l if x[1:] == [1,2]): 
    print ('blue') 
elif any(True for x in l if x[1:] == [2,3]): 
    print('red') 

代碼是這樣的:

True for x in l 

遍歷L(< ---這是字母L BTW),如果下一位是真返回True

if x[1:] == [1,2] 

這將檢查除第一個以外的x的所有值並返回True

any(...) 

發現,如果任何一個值,從位內返回的任何是真

您還可以返回的第一個項目的價值,像這樣

[x[0] for x in l if x[1:] == [1,2]] 

和迭代,作爲以及

0

爲了濾除等於項目(根據你的定義),您可以使用列表中理解和切片:

>>> lst = [['a',1,2],['b',1,2],['c',2,3],['d',1,2]] 
>>> [e for e in lst if e[1:] == [1,2]] 
[['a', 1, 2], ['b', 1, 2], ['d', 1, 2]] 
-1

爲完全通用的情況下,簡單地介紹一些神奇的符號用'*'表示'任何'並編寫自己的簡單比較器

def matches(element, mask): 
    for el, mask_el in zip(element, mask): 
    if mask_el != '*' and el != mask_el: 
     return False 
    return True 

現在你可以做

for list_el in list: 
    if matches(list_el, ['*', 1, 2]): 
    print 'blah' 

的好處是,它是非常通用的,並會在你的面具的「*」任意數量的工作。

+0

請注意評論-1票。如果您發現它是無效的,我會很樂意更新答案,但在我看來,這正是OP詢問的內容,適用於非常通用的案例 – lejlot