与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]