与python字典方法混淆。values().keys()

与python字典方法混淆。values().keys(),python,dictionary,key-value,Python,Dictionary,Key Value,为什么这个代码不起作用?尝试获取值==键的项的返回 L=[0,2,2,1,5,5,6,10] x=dict(enumerate(L)) y=(filter(x.keys()==x.values(), x.items())) print(list(y)) 该方法返回所有键的视图 该方法返回所有值的视图 因此,x.keys()==x.values()询问所有键是否等于所有值,这当然不是真的 另外,filter需要一个函数。但您并没有向它传递函数,您只是向它传递x.keys()==x.values(

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

L=[0,2,2,1,5,5,6,10]
x=dict(enumerate(L))
y=(filter(x.keys()==x.values(), x.items()))
print(list(y))
该方法返回所有键的视图

该方法返回所有值的视图

因此,
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)
一般来说,当您还没有传递到
过滤器
映射
的函数,并且必须使用
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
。最后一个相当于:

y = []
for key, value in x.items():
    if key == value:
        y.append(value)

而且,你一开始并不需要口述;您只需要迭代索引、值对。因此:

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