为什么这段代码:
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]
答案 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]