为什么这段代码不起作用?试图获得值为== key
的项目的回报L=[0,2,2,1,5,5,6,10]
x=dict(enumerate(L))
y=(filter(x.keys()==x.values(), x.items()))
print(list(y))
答案 0 :(得分:2)
keys()
方法返回所有键的视图。
values()
方法返回所有值的视图。
因此,x.keys()==x.values()
询问所有键是否都等于所有值,这当然不是真的。
此外,filter
想要一个功能。但是,您并未将其传递给某个功能,而只是将x.keys()==x.values()
或False
的结果传递给它。要将其转换为函数,您需要使用def
或lambda
来创建新函数。
您要创建的函数是一个接受项的函数,如果该键等于该值,则返回true。由于项目只是一个包含该项目的键和值的2元素元组,因此检查该项目的函数是:
y = filter((lambda item: item[0] == item[1]), x.items())
或者,如果这有点太混乱,请不要尝试将其写入内联;只需def
它:
def key_equals_value(item):
key, value = item
return key == value
y = filter(key_equals_value, x.items())
然而,这非常笨拙;将它作为理解而不是filter
调用更容易编写:
y = ((key, value) for (key, value) in x.items() if key == value)
作为一般规则,只要您没有传递给filter
或map
的功能,就必须创建一个def
或{{1}的功能理解通常会更具可读性,因为你可以直接编写表达式。
而且,如果你想要一个列表而不是一个生成器,你可以通过将parens改为方括号来理解它:
lambda
并且,如果您只想要值,而不是键值对:
y = [(key, value) for (key, value) in x.items() if key == value]
如果您发现自己被理解困惑,可以将它们转换为嵌套语句,底部有y = [value for (key, value) in x.items() if key == value]
。所以,最后一个相当于:
append
另外,你首先不需要这里的词典;你只想迭代索引值对。所以:
y = []
for key, value in x.items():
if key == value:
y.append(value)