【问题标题】:Alternative for 'in' operator for nested lists嵌套列表的“in”运算符的替代方案
【发布时间】:2013-02-10 00:42:54
【问题描述】:

如果我想在 python 的列表中查找某些内容,我可以使用 'in' 运算符:

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

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

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

例如,是否可以在没有 for 循环的情况下在一行中完成?

谢谢!

【问题讨论】:

  • 其实就是嵌套元组,不过没关系。

标签: python nested-lists in-operator


【解决方案1】:

你可能想要any:

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

但某种循环是不可避免的。

【讨论】:

  • 啊完美,谢谢:) 我不知道我可以将这些语句+运算符连接在一条线上。谢谢!
【解决方案2】:

你也可以使用in 来做到这一点

>>> list = [('foo', 'bar'), ('bar', 'foo')]
>>> 'foo' in (x[1] for x in list)
True

EDIT:此方法仅检查foo 是否作为第一个元素。

将元素(任意)搜索为“foo”:

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

【讨论】:

  • 这并不像你想象的那样。 [x[1] for x in list] 只搜索每个内部元组的第二个元素,即['bar', 'foo']
【解决方案3】:

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

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】:

    你可以这样使用 itertools.chain :

    from itertools import chain
    
    nested__seq = [(1,2,3), (4,5,6)]
    
    print 4 in chain(*nested__seq)
    

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

    【讨论】:

      【解决方案5】:

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

      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
      

      【讨论】:

      • 这就是你的方法好!
      猜你喜欢
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多