Python排序多个属性

133*_*day 3 python sorting dictionary sorted

我有一个如下字典.键值对或用户名:名称

d = {"user2":"Tom Cruise", "user1": "Tom Cruise"}
Run Code Online (Sandbox Code Playgroud)

我的问题是我需要按名称对这些进行排序,但如果多个用户包含与上面相同的名称,那么我需要按用户名对它们进行排序.我查找了已排序的函数,但我真的不了解cmp参数和lambda.如果有人可以解释这些并帮助我这将是伟大的!谢谢 :)

Ign*_*ams 6

cmp过时了.lambda只是做一个功能.

sorted(d.iteritems(), key=operator.itemgetter(1, 0))
Run Code Online (Sandbox Code Playgroud)


aar*_*ing 5

我将详细阐述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)

请阅读其余部分,以获得一个假设的例子.在写这篇文章之前,我没有仔细研究问题.它仍然是教育性的,所以我会把它留下来. 我们真的不能说更多,因为

  1. 你无法排序dict.你有一份清单dicts吗?我们可以那样排序.
  2. 你还没有出示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所建议的.