替代嵌套列表的“in”运算符

时间:2013-02-24 22:22:07

标签: python nested-lists in-operator

如果我想在python的列表中找到一些东西,我可以使用'in'运算符:

list = ['foo', 'bar']
'foo' in list #returns True

但是,如果我想在嵌套列表中找到某些内容,该怎么办?

list = [('foo', 'bar'), ('bar', 'foo')]
'foo' in list #returns False

例如,如果没有for循环,是否可以在一行中完成?

谢谢!

5 个答案:

答案 0 :(得分:8)

您可能需要any

>>> list = [('foo', 'bar'), ('bar', 'foo')]
>>> any('foo' in e for e in list)
True

虽然某种循环是不可避免的。

答案 1 :(得分:2)

这是滥用,但你可以很容易地在一行中做到这一点。

mainlist = [('foo', 'bar'), ('bar', 'foo')]
[elem for elem in sublist for sublist in mainlist] #['bar', 'bar', 'foo', 'foo']

'foo' in [elem for elem in sublist for sublist in mainlist] # True

答案 2 :(得分:1)

您也可以使用in

执行此操作
>>> list = [('foo', 'bar'), ('bar', 'foo')]
>>> 'foo' in (x[1] for x in list)
True

编辑:此方法只检查foo是否为第一个元素。

要搜索'foo'元素(any):

 >>>'foo' in reduce(lambda x,y: x+y, list)   
 True

还有一些尝试:

In [7]: list
Out[7]: [('foo', 'me', 'bar'), ('bar', 'foo', 'you')]
In [8]: 'me' in reduce(lambda x,y: x+y, list)
Out[8]: True

In [9]: 'you' in reduce(lambda x,y: x+y, list)
Out[9]: True

答案 3 :(得分:1)

如果您有任意深度的迭代列表,请先将其展平:

import collections 

li= [('foo', 'bar'), ('bar', 'foo'),[[('deeper',('foobar'))]]]

def flatten(l):
    for el in l:
        if isinstance(el, collections.Iterable) and not isinstance(el, basestring):
            for sub in flatten(el):
                yield sub
        else:
            yield el

print 'deeper' in flatten(li)  
print 'foo' in flatten(li) 
print 'nope' in flatten(li)

打印:

True
True
False

答案 4 :(得分:1)

您可以像这样使用itertools.chain:

from itertools import chain

nested__seq = [(1,2,3), (4,5,6)]

print 4 in chain(*nested__seq)

PS:你不应该像“list”那样覆盖bultins