[英]confused with python dictionary methods.values() .keys()
为什么此代码不起作用? 试图获得值==键的商品的退货
L=[0,2,2,1,5,5,6,10]
x=dict(enumerate(L))
y=(filter(x.keys()==x.values(), x.items()))
print(list(y))
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
或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
一个append
语句。 因此,最后一个等效于:
y = []
for key, value in x.items():
if key == value:
y.append(value)
同样,您首先并不需要真正的命令。 您只想遍历索引,值对。 所以:
y = [value for (index, value) in enumerate(L) if index == value]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.