与python字典混淆方法.值().键()

2024-05-01 22:00:40 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么这个代码不起作用?尝试获取值==键的项的返回

L=[0,2,2,1,5,5,6,10]
x=dict(enumerate(L))
y=(filter(x.keys()==x.values(), x.items()))
print(list(y))

Tags: 代码itemskeysfilterdictlistvaluesprint
1条回答
网友
1楼 · 发布于 2024-05-01 22:00:40

^{}方法返回所有键的视图。你知道吗

^{}方法返回所有值的视图。你知道吗

因此,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创建一个函数时,理解通常更具可读性,因为您可以直接编写表达式。你知道吗


如果你想要一个列表而不是一个生成器,你可以理解一下,只要把paren改成方括号:

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)

而且,您一开始并不需要dict;您只需要遍历索引、值对。所以:

y = [value for (index, value) in enumerate(L) if index == value]

相关问题 更多 >