繁体   English   中英

与python字典method.values().keys()混淆

[英]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 要将其转换为函数,您需要使用deflambda来创建新函数。


您要创建的函数是一个接受项的函数,如果键等于该值,则返回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)

通常,只要您没有传递给filtermap的函数,而必须使用deflambda创建一个函数,通常就更容易理解了,因为您可以直接编写表达式。


而且,如果您想要列表而不是生成器,则可以通过将方括号更改为方括号来进行理解:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM