![](/img/trans.png)
[英]Need explanation with output of a python list with lambda function
[英]Python lambda function underscore-colon syntax explanation?
在以下“aDict”是字典的 Python 脚本中,“_: _[0]”在 lambda 函数中做了什么?
sorted(aDict.items(), key=lambda _: _[0])
在 Python 中_
(下划线)是一个有效的标识符,可以用作变量名,例如
>>> _ = 10
>>> print(_)
10
因此,它也可以用作 lambda 表达式的参数名称 - 这就像一个未命名的函数。
在您的示例中sorted()
将aDict.items()
生成的元组传递给它的key
函数。 key 函数返回该元组的第一个元素, sorted()
然后将其用作键,即要与其他值进行比较以确定顺序的值。
请注意,在这种情况下,可以在没有键函数的情况下产生相同的结果,因为元组是根据第一个元素自然排序的,然后是第二个元素,依此类推。所以
sorted(aDict.items())
将产生相同的结果。 因为字典不能包含重复的键,每个元组的第一个元素是唯一的,所以排序时从不考虑第二个元素。
让我们把它分开。
1) 假设你有一个 dict, di:
di={'one': 1, 'two': 2, 'three': 3}
2)现在假设你想要它的每个键值对:
>>> di.items()
[('three', 3), ('two', 2), ('one', 1)]
3)现在你想对它们进行排序(因为字典是无序的):
>>> 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])
的语句sorted(aDict.items(), key=lambda _: _[0])
只是使用_
作为变量名。 它也不做任何事情,因为aDict.items()
产生元组,如果你没有使用键,它无论如何都会按元组的第一个元素排序。 您示例中的 key 函数完全没用。
表单(元组除外)可能需要考虑一个用例。 如果您有字符串,那么您将按第一个字符排序并忽略其余字符:
>>> li=['car','auto','aardvark', 'arizona']
>>> sorted(li, key=lambda c:c[0])
['auto', 'aardvark', 'arizona', 'car']
对比:
>>> sorted(li)
['aardvark', 'arizona', 'auto', 'car']
但是,我仍然不会在 lambda 中使用_
。 _
的使用是用于具有最小副作用机会的 throway 变量。 Python 的命名空间主要使这种担心不是真正的担心。
考虑:
>>> c=22
>>> sorted(li, key=lambda c:c[0])
['auto', 'aardvark', 'arizona', 'car']
>>> c
22
由于lambda
内部的本地命名空间, c
的值得以保留。
但是(在 Python 2.x 但不是 Python 3.x 下)这可能是一个问题:
>>> c=22
>>> [c for c in '123']
['1', '2', '3']
>>> c
'3'
因此(轻量级)约定变成在列表理解或元组扩展等情况下使用_
作为变量,您不必担心践踏您的名字之一。 消息是:如果它被命名为_
,我真的不关心它,除了在这里......
在 Python 中,lambda 用于创建匿名函数。 您示例中的第一个下划线只是 lambda 函数的参数。 在冒号(即函数签名)之后, _[0]
检索变量_
的第一个元素。
诚然,这可能令人困惑。 您示例的 lambda 组件可以重写为lambda x: x[0]
,结果相同。 但是,通常情况下,Python 中的下划线变量名称用于“一次性变量”。 在这种情况下,它意味着我们在每个字典项中唯一关心的就是键。 细微到一个错误,也许。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.