Python-What';这两者之间的区别是什么;在;及;在x中代表x中;

Python-What';这两者之间的区别是什么;在;及;在x中代表x中;,python,data-structures,containers,generator,membership,Python,Data Structures,Containers,Generator,Membership,这是我的Python代码: # 1) if (x not in z for z in y): # 2) if (x not in y): 其中y可以是如下列表: y = ['1','2','3'] 谁能给我解释一下这两句话的区别吗? 谢谢大家! 发电机 首先,(x不在z中表示z在y中)是一个生成器语句,如果在它前面,它将始终返回True if (x not in z for z in y): # Always returns True 这可以用来查看是否有任何或所有嵌套的iterable

这是我的Python代码:

# 1)
if (x not in z for z in y):

# 2)
if (x not in y):
其中y可以是如下列表:

y = ['1','2','3']
谁能给我解释一下这两句话的区别吗? 谢谢大家!

发电机 首先,
(x不在z中表示z在y中)
是一个生成器语句,如果
在它前面,它将始终返回True

if (x not in z for z in y): # Always returns True
这可以用来查看是否有任何或所有嵌套的iterable包含
x

e、 g

因此,如果
y
是:

y = ['hello','how','are','you']
然后,如果
x
例如是
'e'
,则上面的
任何理解将返回
,但
所有理解将返回

有条件的 下面是生成器理解中发生的事情:如果y是一个列表,那么您可以使用:

(x not in z for z in y)
y中的z必须是一个iterable,以便测试包含,哪些字符串是,但在本例中,您只能看到长度为1的字符串中是否有内容。更好的示例是使用整数:

y = [1, 2, 3]

将失败,因为整数不可iterable,但

if (x not in y):
将成功,因为您可以测试实际列表中的成员资格

当你有

y = ['1','2','3']
类似的嵌套级别为:

y = [(1,), (2,), (3,)]

(x not in z for z in y)
您正在测试x是否在其中一个元组中


这有意义吗?

让我们先从简单的一个开始:

if (x not in y):
括号中没有任何含义,因此这相当于:

if x not in y:
lst = []
for z in y:
    lst.append(x)
return lst
检查某个内容是否包含在其他内容中。在您的例子中,您有一个列表
y
,因此您正在检查该列表
y
中(
不在
中)是否包含某些内容(
x
)。因此
'1'不在y
中将
为False
,因为
'1'
y
的一个元素,而
'4'不在y
中将
为True
,因为
'4'
不是
y
的一个元素

另一个则完全不同:

if (x not in z for z in y)
这是我们的一份工作。生成器表达式的格式为
(x代表y中的z)
,与此代码等效:

for z in y:
    yield x
你以前可能听说过;它们类似,但使用方括号而不是括号:
[x代表y中的z]
。当它们返回一个列表时,它们更容易理解。它们相当于:

if x not in y:
lst = []
for z in y:
    lst.append(x)
return lst
本质上,您是在
y
的元素上循环,在迭代中调用每个元素
z
并返回该元素的
x
。在您的例子中,
x
本身就是一个表达式:
x不在z
中,这与上面的基本相同:您正在检查
x
是否不包含在
z

现在,生成器表达式有点复杂,因为它们是在向它请求元素时计算的,所以现在让我们假设我们有一个列表

if [x not in z for z in y]:
因此,这就是为
y
中的每个元素
z
计算
x而不是z
。因此,对于您的
y
,结果列表如下:

[x not in '1', x not in '2', x not in '3']
对于实
x
,这将导致一个包含三个布尔值的列表。现在,非空列表始终为true,因此无论此检查的结果如何,if
-检查都将成功

生成器表达式将返回一个生成器,它是一个比列表更复杂的对象。尽管如此,这也是正确的,所以无论单个值如何,您的检查也将成功

现在想象一下,我们想确保,对于列表中的这三个元素,我们希望所有检查都得到
True
。为此,我们可以使用函数来检查生成器中的列表或值是否只包含真值

if all(x not in z for z in y):
因此,如果
x
不包含在列表
y
的任何元素中,则此操作将成功。另一方面,如果我们想检查列表或生成器中是否至少有一个trueish值,那么我们可以使用该函数

  • 这个

    if (x not in z for z in y):
    
    if (x not in y):
    
    相当于

    if True:
    
    因为

    >>> (x not in z for z in y)
    <generator object <genexpr> at 0x000000E7AE26FB88>
    >>> bool(_)
    True
    

    if x not in y:
    
    内部决定

    if not y.__contains__(x):
    

  • 在第一种情况下,您可能打算写:

    if any(x not in z for z in y):
    # same as
    if not all(x in z for z in y):
    
    或:


    我假设这是一个一般性问题,列表中的实际值并不重要

    用于:

    语句中
    表示您有一个“列表理解”或“生成器表达式”(在参数内)。它将生成一个列表。这是一个带有过滤器的列表理解(z部分中没有
    x)。但最终结果将是一个列表,它可能是空的,也可能不是空的。现在,
    if
    语句将对其进行“真实性”评估,其中空列表被视为false,非空列表被视为true

    2) if (x not in y):
    
    这是一个直接的“包含测试”,直接测试iterable
    y
    中是否包含
    x
    ,并返回布尔值。这可能是一个快速测试,具体取决于对象的类型
    y


    在大多数情况下,第一种形式可能较慢且不必要。第一个必须创建并销毁一个临时列表。

    非常感谢!如果y=['hello'、'how'、'are'、'you']呢?那么x是什么?@krishah会检查x是否是这些单词中的一个字母。e、 例如,
    x='h'>True
    x='p'>假
    x='hello'>False
    1) if (x not in z for z in y):
    
    2) if (x not in y):