Python 2.7:检查子列表是否包含项目

时间:2012-12-05 16:39:06

标签: python list

我有一个Python列表。如下图所示,我想检查其中一个子列表是否包含一个项目。以下尝试失败。有没有人知道一个简单的方法 - 没有我写自己的for循环?

>>> a = [[1,2],[3,4],[5,6],7,8,9]
>>> 2 in a

我希望True但回复是False

4 个答案:

答案 0 :(得分:14)

>>> a = [[1,2],[3,4],[5,6],7,8,9]
>>> any(2 in i for i in a)
True

答案 1 :(得分:3)

对于包含一些列表和一些整数的列表,您需要先测试元素i是否为列表,然后再测试搜索目标是否位于i中。

>>> any(2 in i for i in a if isinstance(i, list))
True
>>> any(8 in i for i in a if isinstance(i, list))
False

如果不检查i是否为列表,则会收到类似以下的错误。接受的答案是错误的,因为它给出了此错误。

>>> any(8 in i for i in a)
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    any(8 in i for i in a)
  File "<pyshell#3>", line 1, in <genexpr>
    any(8 in i for i in a)
TypeError: argument of type 'int' is not iterable

答案 2 :(得分:1)

这样做的简单方法是:

  a = [[1,2],[3,4],[5,6],7,8,9]
  result = [2 in i for i in a]

  True in result --> True

答案 3 :(得分:-1)

如果没有某种循环,我认为没有办法进行测试。

这是一个函数,它使用一个简单的for循环来显式检查子列表中的对象:

def sublist_contains(lst, obj):
    for item in lst:
        try:
            if obj in item:
                return True
        except TypeError:
            pass
    return False

当然,这不会测试对象是否在顶级列表中,如果存在多个嵌套级别,它也不会起作用。这是一个使用递归的更通用的解决方案,它将循环放在一个生成器表达式中,该表达式传递给内置函数any

def nested_contains(lst, obj):
    return any(item == obj or
               isinstance(item, list) and nested_contains(item, obj)
               for item in lst)