Python:列表理解奇怪的行为

时间:2017-04-10 08:46:36

标签: python list-comprehension

为什么这段代码:

x = {"first":(True, "first description"), "second":(False, "second description")}
items = ["first", "second"]

for element in [k in x and x[k][0] for k in items]:
    print element

打印

而不是" items" -list中与表达式匹配的元素

k in x and x[k][0]

4 个答案:

答案 0 :(得分:4)

您正在打印表达式k in x and x[k][0]的结果。

这将是False(如果k in x条件的结果为假),或x[k][0]的结果(如果{{1}的结果是真的)。由于k in x是输入样本中的布尔对象,因此您在这里总是得到布尔值;列表理解无处可生成密钥。

如果您想过滤,请在循环后使用x[k][0]语句:

if

然后生成一个包含[k for k in items if k in x and x[k][0]] 值的列表,表达式生成为true,对于样本数据,该列表只匹配一个元素k,因为只有该键是元组中第一个设置为['first']的元素。

答案 1 :(得分:3)

[k in x and x[k][0] for k in items]k in x and x[k][0]中的每个元素返回布尔表达式items,对于第一个元素是真实的元素,它将为True。

你的意思是:

[k for k in items if k in x and x[k][0]]

答案 2 :(得分:2)

x = {"first":(True, "first description"), "second":(False, "second description")}
items = ["first", "second"]

for element in [k in x and x[k][0] for k in items]:
    print element

让我们试着从列表理解中了解它给你的结果。

[k in x and x[k][0] for k in items]

让我们从右侧观察它。对于项目中的k == ['first','second']

第一次迭代

k ='first'

['第一'在x(真)和x ['第一'] [0](真)]

[真实与真实]

[TRUE]

第二次迭代

k ='second'

列表是[True]

[真,'秒'在x(真)和x ['秒'] [0](假)]

[真,真,假]

[True,False]

现在,

for element in [True, False]:
    print element

它应该打印,

这就是它正在做的事情。

答案 3 :(得分:0)

因为在expression中生成新列表的[k in x and x[k][0] for k in items]k in x and x[k][0],而and进程的评估是它将整个表达式拆分为{ {1}},然后评估每个and,返回第一个"sub-expression"值或最后一个值,无论它是什么。在这种情况下,它首先评估falsy,它始终为k in x,然后它将返回true的结果,从而生成最终结果:

  

x[k][0]

如果您尝试[True, False],您将获得结果:

  

['第一个描述','第二个描述']

要过滤元素,您需要将测试条件放在整个表达式的尾部,如:

[k in x and x[k][0] for k in items]