这在Python lambda函数中做了什么?

时间:2016-10-10 22:21:27

标签: python sorting lambda key

在下面的Python脚本中,“aDict”是一个字典,“_:_ [0]”在lambda函数中做了什么?

sorted(aDict.items(), key=lambda _: _[0])

3 个答案:

答案 0 :(得分:2)

在Python中,lambda用于创建匿名函数。您的示例中的第一个下划线只是lambda函数的参数。在冒号(即函数签名)之后,_[0]检索变量_的第一个元素。

不可否认,这可能令人困惑;您的示例的lambda组件可以重写为lambda x: x[0],结果相同。但是,传统上,Python中的下划线变量名称用于"一次性变量"。在这种情况下,它意味着我们在每个字典项中唯一关心的是键。或许是一种错误。

答案 1 :(得分:2)

在Python中_(下划线)是一个有效的标识符,可以用作变量名,例如

>>> _ = 10
>>> print(_)
10

因此它也可以用作lambda表达式的参数名称 - 就像一个未命名的函数。

在您的示例中,sorted()aDict.items()生成的元组传递给其key函数。 key函数返回该元组的第一个元素,sorted()然后将其用作键,即要与其他值进行比较以确定顺序的值。

请注意,在这种情况下,可以在没有键函数的情况下生成相同的结果,因为元组是根据第一个元素,然后是第二个元素等自然排序的。所以

sorted(aDict.items())

会产生相同的结果。由于字典不能包含重复键,因此每个元组的第一个元素是唯一的,因此在排序时永远不会考虑第二个元素。

答案 2 :(得分:2)

让我们分开。

1)假设你有一个dict,di:

di={'one': 1, 'two': 2, 'three': 3}

2)现在假设你想要每个关键的值对:

 >>> di.items()
 [('three', 3), ('two', 2), ('one', 1)]

3)现在你想对它们进行排序(因为dicts是无序的):

>>> sorted(di.items())
[('one', 1), ('three', 3), ('two', 2)]

请注意,元组按字典顺序排序 - 由元组的第一个元素中的文本组成。这相当于一系列元组的t[0]

假设您希望它按数字排序。你会使用key函数:

>>> sorted(di.items(), key=lambda t: t[1])
[('one', 1), ('two', 2), ('three', 3)]

您拥有sorted(aDict.items(), key=lambda _: _[0])的声明只是使用_作为变量名称。它也没有做任何事情,因为aDict.items()产生元组,如果你没有使用密钥,它会按元组的第一个元素进行排序。您示例中的关键功能完全没用。

可能需要考虑表单(除了元组之外)的用例。如果您有字符串,那么您将按第一个字符排序并忽略其余字符:

>>> li=['car','auto','aardvark', 'arizona']
>>> sorted(li, key=lambda c:c[0])
['auto', 'aardvark', 'arizona', 'car']

Vs的:

>>> sorted(li)
['aardvark', 'arizona', 'auto', 'car']

然而,我仍然不会在lambda中使用__的使用是针对具有最小副作用机会的throway变量。 Python具有名称空间,这些名称空间大多使人担心并不是真正的担心

考虑:

>>> c=22
>>> sorted(li, key=lambda c:c[0])
['auto', 'aardvark', 'arizona', 'car']
>>> c
22

由于c中的本地命名空间,lambda的值被保留。

然而(在Python 2.x下但不是Python 3.x)这可能是一个问题:

>>> c=22
>>> [c for c in '123']
['1', '2', '3']
>>> c
'3'

因此,(轻量级)约定在列表推导或元组扩展等情况下变为使用_变量,在那里你不必担心践踏你的某个名字。消息是:如果它被命名为_,我真的不关心它,除了这里......