133*_*day 3 python sorting dictionary sorted
我有一个如下字典.键值对或用户名:名称
d = {"user2":"Tom Cruise", "user1": "Tom Cruise"}
Run Code Online (Sandbox Code Playgroud)
我的问题是我需要按名称对这些进行排序,但如果多个用户包含与上面相同的名称,那么我需要按用户名对它们进行排序.我查找了已排序的函数,但我真的不了解cmp参数和lambda.如果有人可以解释这些并帮助我这将是伟大的!谢谢 :)
cmp过时了.lambda只是做一个功能.
sorted(d.iteritems(), key=operator.itemgetter(1, 0))
Run Code Online (Sandbox Code Playgroud)
我将详细阐述Ignacio Vazquez-Abrams的答案.cmp已弃用.不要使用它.请改用该key属性.
lambda发挥作用.这是一个表达式,所以可以去一个正常的def声明不能但它的身体仅限于一个表达式的地方.
my_func = lambda x: x + 1
Run Code Online (Sandbox Code Playgroud)
这定义了一个接受单个参数x并返回的函数x + 1.lambda x, y=1: x + y定义一个带x参数的y函数,一个默认值为1 的可选参数并返回x + y.正如你所看到的,它实际上就像一个def声明,除了它是一个表达式并且仅限于一个单独的表达式.
该key属性的目的是sorted为要排序的序列的每个元素调用它,并使用它返回的值进行比较.
list_ = ['a', 'b', 'c']
sorted(list_, key=lambda x: 1)
Run Code Online (Sandbox Code Playgroud)
请阅读其余部分,以获得一个假设的例子.在写这篇文章之前,我没有仔细研究问题.它仍然是教育性的,所以我会把它留下来.
我们真的不能说更多,因为
dict.你有一份清单dicts吗?我们可以那样排序.username钥匙.
我会假设它是这样的
users = [{'name': 'Tom Cruise', 'username': user234234234, 'reputation': 1},
{'name': 'Aaron Sterling', 'username': 'aaronasterling', 'reputation': 11725}]
Run Code Online (Sandbox Code Playgroud)
如果你想确认我比汤姆克鲁斯更棒,你可以这样做:
sorted(users, key=lambda x: x['reputation'])
Run Code Online (Sandbox Code Playgroud)
这只是传递一个函数,该函数返回'reputation'列表中每个字典的值.但lambdas可能会慢一点.大部分时间operator.itemgetter都是你想要的.
operator.itemgetter 获取一系列键并返回一个函数,该函数接受一个对象并返回其参数值的元组.
因此f = operator.itemgetter('name', 'username')它将返回基本上相同的函数,
lambda d: (d['name'], d['username'])不同之处在于它应该原则上运行得更快,而且你不必看丑陋的lambda表达式.
因此,要按dict名称和用户名对s 列表进行排序,请执行
sorted(list_of_dicts, operator.itemgetter('name', 'username'))
Run Code Online (Sandbox Code Playgroud)
这正是Ignacio Vazquez-Abrams所建议的.