2016-09-30 71 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