忽略列表搜索中的值

时间:2016-09-30 23:25:04

标签: python list

我正在使用列表存储属性,当我搜索相同的项目时出现了这个问题:

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')

3 个答案:

答案 0 :(得分: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 :(得分:0)

:由于pkacprzak,D实际上设法在一行中完成。

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则返回True

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

这将检查除第一个之外的所有x值并返回True

any(...)

查找从any中的位返回的任何值是否为True

您还可以返回第一项的值,如此

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

并迭代它

答案 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'

好消息是它非常通用,并且可以使用任意数量的' *'在你的面具。