Python 如何检查第二个子列表中是否存在元素?

Python 如何检查第二个子列表中是否存在元素?,python,python-3.x,for-loop,nested,generator-expression,Python,Python 3.x,For Loop,Nested,Generator Expression,如果我有这样一份清单: L = [ ['a', 'b'], ['c', 'f'], ['d', 'e'] ] if any('f' in second_sublist for second_sublist in sublist for sublist in L) 我知道我可以通过以下方式使用任何子列表检查是否包含例如“f”: if any('f' in sublist for sublist in L) #

如果我有这样一份清单:

L = [
           ['a', 'b'], 
           ['c', 'f'], 
           ['d', 'e']
       ]
if any('f' in second_sublist for second_sublist in sublist for sublist in L)
我知道我可以通过以下方式使用任何子列表检查是否包含例如“f”:

if any('f' in sublist for sublist in L) # True
L = [
           [
               ['a', 'b'], 
               ['c', 'f'], 
               ['d', 'e']
           ], 
           [
               ['z', 'i', 'l'],
               ['k']
           ]
       ]
但是,我将如何在第二个子列表中进行搜索,即,如果列表以以下方式初始化:

if any('f' in sublist for sublist in L) # True
L = [
           [
               ['a', 'b'], 
               ['c', 'f'], 
               ['d', 'e']
           ], 
           [
               ['z', 'i', 'l'],
               ['k']
           ]
       ]
我尝试将for链接到如下表达式中:

L = [
           ['a', 'b'], 
           ['c', 'f'], 
           ['d', 'e']
       ]
if any('f' in second_sublist for second_sublist in sublist for sublist in L)

但是,这会崩溃,因为没有定义名称“sublist”。

首先将逻辑写入常规for循环:

然后使用for语句以相同顺序重写为生成器表达式:

any('f' in second_sub for first_sub in L for second_sub in first_sub)

首先将逻辑编写为常规for循环:

然后使用for语句以相同顺序重写为生成器表达式:

any('f' in second_sub for first_sub in L for second_sub in first_sub)

如果您不需要知道“f”位于何处,也可以在此处使用itertools

import itertools

any('f' in x for x in itertools.chain.from_iterable(l))

这将展平嵌套列表并分别计算每个列表。这里的好处是,如果您有三个嵌套列表,则此解决方案仍能正常工作,而无需继续为循环编写嵌套。

如果您不需要知道“f”位于何处,也可以在此处使用itertools

import itertools

any('f' in x for x in itertools.chain.from_iterable(l))

这将展平嵌套列表并分别计算每个列表。这里的好处是,如果您有三个嵌套列表,则此解决方案仍然可以运行,而无需继续为循环编写嵌套。

旁注:不要隐藏内置列表。不要调用变量列表。换个说法:比如L,或者lst。如果您以后需要使用内置的,您将无法使用。@jpp我这样做只是为了使imo更易于阅读。如果我想创建这样的静态列表,我也会使用元组。不,这会使它更难阅读/更容易出错。任何复制/粘贴您的代码的人都会发现他们的会话不允许稍后在代码中列出。如果易于阅读是你的目标,你也可以使用少L个字符。@jpp我相信这取决于读者,但我也认为不隐藏列表函数是有效的,这就是我调整它的原因。旁注:不要隐藏内置列表。不要调用变量列表。换个说法:比如L,或者lst。如果您以后需要使用内置的,您将无法使用。@jpp我这样做只是为了使imo更易于阅读。如果我想创建这样的静态列表,我也会使用元组。不,这会使它更难阅读/更容易出错。任何复制/粘贴您的代码的人都会发现他们的会话不允许稍后在代码中列出。如果你的目标是便于阅读,你也可以使用不带L的字符。@jpp我相信这取决于读者,但我也认为不隐藏列表函数是有效的,这就是我调整它的原因。我会选择chain.from_iterable。我会选择chain.from_iterable。