Lor*_*nzo 76 python sorting list
我正在重构我的一些旧代码,并且遇到了这个问题:
alist.sort(cmp_items)
def cmp_items(a, b):
if a.foo > b.foo:
return 1
elif a.foo == b.foo:
return 0
else:
return -1
Run Code Online (Sandbox Code Playgroud)
代码可以工作(我在大约3年前写过它!)但是我无法在Python文档的任何地方找到这个东西,并且每个人都使用它sorted()来实现自定义排序.有人可以解释为什么这有效吗?
And*_*ark 91
作为旁注,这是实现相同排序的更好选择:
alist.sort(key=lambda x: x.foo)
Run Code Online (Sandbox Code Playgroud)
或者:
import operator
alist.sort(key=operator.attrgetter('foo'))
Run Code Online (Sandbox Code Playgroud)
查看排序方法,这非常有用.
mil*_*s82 53
它在这里记录.
sort()方法采用可选参数来控制比较.
cmp指定两个参数(列表项)的自定义比较函数,它应返回负数,零或正数,具体取决于第一个参数是否被认为小于,等于或大于第二个参数:cmp = lambda x,y :cmp(x.lower(),y.lower()).默认值为None.
The*_*Cat 14
这在 Python 3 中不起作用。
不过,您可以使用 functools cmp_to_key 来使旧式比较函数起作用。
from functools import cmp_to_key
def cmp_items(a, b):
if a.foo > b.foo:
return 1
elif a.foo == b.foo:
return 0
else:
return -1
cmp_items_py3 = cmp_to_key(cmp_items)
alist.sort(cmp_items_py3)
Run Code Online (Sandbox Code Playgroud)
小智 10
就像这个例子.你想要排序这个列表.
[('c', 2), ('b', 2), ('a', 3)]
Run Code Online (Sandbox Code Playgroud)
输出:
[('a', 3), ('b', 2), ('c', 2)]
Run Code Online (Sandbox Code Playgroud)
你应该按第二项排序元组,然后是第一项:
def letter_cmp(a, b):
if a[1] > b[1]:
return -1
elif a[1] == b[1]:
if a[0] > b[0]:
return 1
else:
return -1
else:
return 1
Run Code Online (Sandbox Code Playgroud)
最后:
只是 sort(letter_cmp)
我知道很多人已经发布了一些很好的答案。但是,我想建议一种无需导入任何库的简单易用的方法。
l = [(2, 3), (3, 4), (2, 4)]
l.sort(key = lambda x: (-x[0], -x[1]) )
print(l)
l.sort(key = lambda x: (x[0], -x[1]) )
print(l)
Run Code Online (Sandbox Code Playgroud)
输出将是
[(3, 4), (2, 4), (2, 3)]
[(2, 4), (2, 3), (3, 4)]
Run Code Online (Sandbox Code Playgroud)
输出将根据我们在元组格式中提供的参数的顺序进行排序
更好的是:
student_tuples = [
('john', 'A', 15),
('jane', 'B', 12),
('dave', 'B', 10),
]
sorted(student_tuples, key=lambda student: student[2]) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
Run Code Online (Sandbox Code Playgroud)
摘自:https: //docs.python.org/3/howto/sorting.html
| 归档时间: |
|
| 查看次数: |
94435 次 |
| 最近记录: |