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

时间:2018-06-19 03:31:13

标签: python dictionary key-value

为什么这段代码不起作用?试图获得值为== key

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

1 个答案:

答案 0 :(得分:2)

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的功能,就必须创建一个def或{{1}的功能理解通常会更具可读性,因为你可以直接编写表达式。

而且,如果你想要一个列表而不是一个生成器,你可以通过将parens改为方括号来理解它:

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)