搜索多个列表

时间:2011-12-30 17:21:30

标签: python-3.x

我正在使用Python 3.x。

如果我想查看三个列表中是否有8个数字,我将如何在Python中执行此操作。

如果我有:

list1 = [5, 6, 7, 2, 3, 5]
list2 = [2, 5, 8, 9, 1, 5]
list3 = [4, 6, 7 ,9, 2, 3]

如何在python中正确编写?:

if 5 and 6 and 3 in (lists 1, 2, and 3)

括号中的部分显然不正确。我如何在Python中为此编写正确的语法?

1 个答案:

答案 0 :(得分:2)

这很简单,很明显。如果要检查任何列表中是否有任何数字,请执行以下操作:

def any_number_in_any_lists(numbers, lists):
    for alist in lists:
        for number in numbers:
             if number in alist:
                  return True
    return False

如果您想检查所有号码是否在所有列表中,请执行以下操作:

def all_number_in_all_lists(numbers, lists):
    for alist in lists:
        for number in numbers:
             if number not in alist:
                  return False
    return True

如果要在任何列表中检查所有号码,它会变得更复杂。最容易和更清楚的是有两种方法:

def all_numbers_in_list(l, numbers):
    for n in numbers:
        if n is not in l:
             return False
    return True

def all_numbers_in_any_list(lists, numbers):
    for l in lists:
        if all_numbers_in_list(l, numbers):
            return True
    return False            

你可以使用上面的函数:

if all_number_in_all_lists([3,5,6], [list1, list2, list3]):
    do something
else:
    do something else

由于您需要的代码较少,因此您可以使用各种“快捷方式”。快捷方式可以缩短代码,但也会使代码不那么清晰和难以阅读,因此它们不是更好的选择。例如,您可以使用any函数和生成器表达式:

 def any_number_in_any_lists(numbers, lists):
     for alist in lists:
         if any(number in alist for number in numbers):
             return True
     return False

你甚至可以嵌套其中两个:

def any_number_in_any_lists(numbers, lists):
    return any(any(number in alist for number in numbers) for alist in lists)

但要理解代码需要很长时间才能获得更多脑力。它也会明显变慢,因为它会遍历所有列表,即使它在第一个列表中找到匹配。我想不出任何目前不慢的方式,但可能有一个。但是你不太可能发现任何明显更快且不会更混乱的东西。

对于检查所有数字是否在所有列表中的情况,您可以这样做:

def all_number_in_all_lists(numbers, lists):
    return all(all(number in alist for number in numbers) for alist in lists)

由于某种原因,与上述功能相比,它也需要两倍的时间,即使没有快捷方式。它可能与创建中介列表有关。

Python通常就是这种情况:简单就是最好的。

您所使用的代码的逐行说明,因为您要求它:

def all_numbers_in_list(l, numbers):

使用参数“l”和“numbers”定义一个名为“all_numbers_in_list”的函数。

    for n in numbers:

对于数字中的每个项目,为该数字指定变量“n”,然后执行以下块。

        if n is not in l:

如果变量“n”的值不在列表“l”中。

             return False

以False作为返回值退出函数。

    return True

退出该函数,返回值为True。

def all_numbers_in_any_list(lists, numbers):

定义一个名为“all_numbers_in_any_list”的函数,其参数为“lists”和“numbers”。

    for l in lists:

对于列表中的每个项目,将变量“l”分配给该数字,然后执行以下块。

        if all_numbers_in_list(l, numbers):

如果使用参数“l”和“numbers”调用函数“all_numbers_in_list”,则返回True,执行以下操作:

            return True

退出该函数,返回值为True。

    return False 

以False作为返回值退出函数。

这有帮助吗?