Câu trả lời này hoạt động cho bất kỳ loại cột nào trong từ điển - cột phủ định không cần phải là một số.
def multikeysort[items, columns]:
from operator import itemgetter
comparers = [[[itemgetter[col[1:].strip[]], -1] if col.startswith['-'] else
[itemgetter[col.strip[]], 1]] for col in columns]
def comparer[left, right]:
for fn, mult in comparers:
result = cmp[fn[left], fn[right]]
if result:
return mult * result
else:
return 0
return sorted[items, cmp=comparer]
Bạn có thể gọi nó như thế này:
b = [{u'TOT_PTS_Misc': u'Utley, Alex', u'Total_Points': 96.0},
{u'TOT_PTS_Misc': u'Russo, Brandon', u'Total_Points': 96.0},
{u'TOT_PTS_Misc': u'Chappell, Justin', u'Total_Points': 96.0},
{u'TOT_PTS_Misc': u'Foster, Toney', u'Total_Points': 80.0},
{u'TOT_PTS_Misc': u'Lawson, Roman', u'Total_Points': 80.0},
{u'TOT_PTS_Misc': u'Lempke, Sam', u'Total_Points': 80.0},
{u'TOT_PTS_Misc': u'Gnezda, Alex', u'Total_Points': 78.0},
{u'TOT_PTS_Misc': u'Kirks, Damien', u'Total_Points': 78.0},
{u'TOT_PTS_Misc': u'Worden, Tom', u'Total_Points': 78.0},
{u'TOT_PTS_Misc': u'Korecz, Mike', u'Total_Points': 78.0},
{u'TOT_PTS_Misc': u'Swartz, Brian', u'Total_Points': 66.0},
{u'TOT_PTS_Misc': u'Burgess, Randy', u'Total_Points': 66.0},
{u'TOT_PTS_Misc': u'Smugala, Ryan', u'Total_Points': 66.0},
{u'TOT_PTS_Misc': u'Harmon, Gary', u'Total_Points': 66.0},
{u'TOT_PTS_Misc': u'Blasinsky, Scott', u'Total_Points': 60.0},
{u'TOT_PTS_Misc': u'Carter III, Laymon', u'Total_Points': 60.0},
{u'TOT_PTS_Misc': u'Coleman, Johnathan', u'Total_Points': 60.0},
{u'TOT_PTS_Misc': u'Venditti, Nick', u'Total_Points': 60.0},
{u'TOT_PTS_Misc': u'Blackwell, Devon', u'Total_Points': 60.0},
{u'TOT_PTS_Misc': u'Kovach, Alex', u'Total_Points': 60.0},
{u'TOT_PTS_Misc': u'Bolden, Antonio', u'Total_Points': 60.0},
{u'TOT_PTS_Misc': u'Smith, Ryan', u'Total_Points': 60.0}]
a = multikeysort[b, ['-Total_Points', 'TOT_PTS_Misc']]
for item in a:
print item
Hãy thử nó với một trong hai cột phủ định. Bạn sẽ thấy thứ tự sắp xếp đảo ngược.
Tiếp theo: Thay đổi nó để nó không sử dụng thêm lớp ....
2016-01-17
Lấy cảm hứng từ câu trả lời này Cách tốt nhất để có được mục đầu tiên từ một điều kiện phù hợp với điều kiện là gì ?, Tôi đã rút ngắn mã:
from operator import itemgetter as i
def multikeysort[items, columns]:
comparers = [
[[i[col[1:].strip[]], -1] if col.startswith['-'] else [i[col.strip[]], 1]]
for col in columns
]
def comparer[left, right]:
comparer_iter = [
cmp[fn[left], fn[right]] * mult
for fn, mult in comparers
]
return next[[result for result in comparer_iter if result], 0]
return sorted[items, cmp=comparer]
Trong trường hợp bạn thích mã của bạn terse.
Muộn hơn 2016-01-17
Điều này hoạt động với Python3 [loại bỏ đối số
from operator import itemgetter as i
def multikeysort[items, columns]:
comparers = [
[[i[col[1:].strip[]], -1] if col.startswith['-'] else [i[col.strip[]], 1]]
for col in columns
]
def comparer[left, right]:
comparer_iter = [
cmp[fn[left], fn[right]] * mult
for fn, mult in comparers
]
return next[[result for result in comparer_iter if result], 0]
return sorted[items, cmp=comparer]
3 thành from operator import itemgetter as i
def multikeysort[items, columns]:
comparers = [
[[i[col[1:].strip[]], -1] if col.startswith['-'] else [i[col.strip[]], 1]]
for col in columns
]
def comparer[left, right]:
comparer_iter = [
cmp[fn[left], fn[right]] * mult
for fn, mult in comparers
]
return next[[result for result in comparer_iter if result], 0]
return sorted[items, cmp=comparer]
4]:from operator import itemgetter as i
from functools import cmp_to_key
def cmp[x, y]:
"""
Replacement for built-in function cmp that was removed in Python 3
Compare the two objects x and y and return an integer according to
the outcome. The return value is negative if x < y, zero if x == y
and strictly positive if x > y.
//portingguide.readthedocs.io/en/latest/comparisons.html#the-cmp-function
"""
return [x > y] - [x < y]
def multikeysort[items, columns]:
comparers = [
[[i[col[1:].strip[]], -1] if col.startswith['-'] else [i[col.strip[]], 1]]
for col in columns
]
def comparer[left, right]:
comparer_iter = [
cmp[fn[left], fn[right]] * mult
for fn, mult in comparers
]
return next[[result for result in comparer_iter if result], 0]
return sorted[items, key=cmp_to_key[comparer]]
Lấy cảm hứng từ câu trả lời này làm thế nào tôi nên sắp xếp tùy chỉnh trong Python 3?
Trong Python, việc sắp xếp một danh sách các từ điển với phương thức
from operator import itemgetter as i
def multikeysort[items, columns]:
comparers = [
[[i[col[1:].strip[]], -1] if col.startswith['-'] else [i[col.strip[]], 1]]
for col in columns
]
def comparer[left, right]:
comparer_iter = [
cmp[fn[left], fn[right]] * mult
for fn, mult in comparers
]
return next[[result for result in comparer_iter if result], 0]
return sorted[items, cmp=comparer]
5 hoặc hàm from operator import itemgetter as i
def multikeysort[items, columns]:
comparers = [
[[i[col[1:].strip[]], -1] if col.startswith['-'] else [i[col.strip[]], 1]]
for col in columns
]
def comparer[left, right]:
comparer_iter = [
cmp[fn[left], fn[right]] * mult
for fn, mult in comparers
]
return next[[result for result in comparer_iter if result], 0]
return sorted[items, cmp=comparer]
6 làm tăng lỗi from operator import itemgetter as i
def multikeysort[items, columns]:
comparers = [
[[i[col[1:].strip[]], -1] if col.startswith['-'] else [i[col.strip[]], 1]]
for col in columns
]
def comparer[left, right]:
comparer_iter = [
cmp[fn[left], fn[right]] * mult
for fn, mult in comparers
]
return next[[result for result in comparer_iter if result], 0]
return sorted[items, cmp=comparer]
7 theo mặc định.Bằng cách chỉ định tham số
from operator import itemgetter as i
def multikeysort[items, columns]:
comparers = [
[[i[col[1:].strip[]], -1] if col.startswith['-'] else [i[col.strip[]], 1]]
for col in columns
]
def comparer[left, right]:
comparer_iter = [
cmp[fn[left], fn[right]] * mult
for fn, mult in comparers
]
return next[[result for result in comparer_iter if result], 0]
return sorted[items, cmp=comparer]
8 của from operator import itemgetter as i
def multikeysort[items, columns]:
comparers = [
[[i[col[1:].strip[]], -1] if col.startswith['-'] else [i[col.strip[]], 1]]
for col in columns
]
def comparer[left, right]:
comparer_iter = [
cmp[fn[left], fn[right]] * mult
for fn, mult in comparers
]
return next[[result for result in comparer_iter if result], 0]
return sorted[items, cmp=comparer]
5 hoặc from operator import itemgetter as i
def multikeysort[items, columns]:
comparers = [
[[i[col[1:].strip[]], -1] if col.startswith['-'] else [i[col.strip[]], 1]]
for col in columns
]
def comparer[left, right]:
comparer_iter = [
cmp[fn[left], fn[right]] * mult
for fn, mult in comparers
]
return next[[result for result in comparer_iter if result], 0]
return sorted[items, cmp=comparer]
6, bạn có thể sắp xếp một danh sách các từ điển theo giá trị của khóa cụ thể.Bài viết này mô tả các nội dung sau đây.
- Sắp xếp danh sách các từ điển làm tăng lỗi theo mặc định
- Chỉ định biểu thức Lambda cho tham số
8from operator import itemgetter as i def multikeysort[items, columns]: comparers = [ [[i[col[1:].strip[]], -1] if col.startswith['-'] else [i[col.strip[]], 1]] for col in columns ] def comparer[left, right]: comparer_iter = [ cmp[fn[left], fn[right]] * mult for fn, mult in comparers ] return next[[result for result in comparer_iter if result], 0] return sorted[items, cmp=comparer]
- Chỉ định
2 cho tham sốfrom operator import itemgetter as i from functools import cmp_to_key def cmp[x, y]: """ Replacement for built-in function cmp that was removed in Python 3 Compare the two objects x and y and return an integer according to the outcome. The return value is negative if x < y, zero if x == y and strictly positive if x > y. //portingguide.readthedocs.io/en/latest/comparisons.html#the-cmp-function """ return [x > y] - [x < y] def multikeysort[items, columns]: comparers = [ [[i[col[1:].strip[]], -1] if col.startswith['-'] else [i[col.strip[]], 1]] for col in columns ] def comparer[left, right]: comparer_iter = [ cmp[fn[left], fn[right]] * mult for fn, mult in comparers ] return next[[result for result in comparer_iter if result], 0] return sorted[items, key=cmp_to_key[comparer]]
8from operator import itemgetter as i def multikeysort[items, columns]: comparers = [ [[i[col[1:].strip[]], -1] if col.startswith['-'] else [i[col.strip[]], 1]] for col in columns ] def comparer[left, right]: comparer_iter = [ cmp[fn[left], fn[right]] * mult for fn, mult in comparers ] return next[[result for result in comparer_iter if result], 0] return sorted[items, cmp=comparer]
- Sắp xếp theo nhiều phím
4,from operator import itemgetter as i from functools import cmp_to_key def cmp[x, y]: """ Replacement for built-in function cmp that was removed in Python 3 Compare the two objects x and y and return an integer according to the outcome. The return value is negative if x < y, zero if x == y and strictly positive if x > y. //portingguide.readthedocs.io/en/latest/comparisons.html#the-cmp-function """ return [x > y] - [x < y] def multikeysort[items, columns]: comparers = [ [[i[col[1:].strip[]], -1] if col.startswith['-'] else [i[col.strip[]], 1]] for col in columns ] def comparer[left, right]: comparer_iter = [ cmp[fn[left], fn[right]] * mult for fn, mult in comparers ] return next[[result for result in comparer_iter if result], 0] return sorted[items, key=cmp_to_key[comparer]]
5 cho một danh sách từ điểnfrom operator import itemgetter as i from functools import cmp_to_key def cmp[x, y]: """ Replacement for built-in function cmp that was removed in Python 3 Compare the two objects x and y and return an integer according to the outcome. The return value is negative if x < y, zero if x == y and strictly positive if x > y. //portingguide.readthedocs.io/en/latest/comparisons.html#the-cmp-function """ return [x > y] - [x < y] def multikeysort[items, columns]: comparers = [ [[i[col[1:].strip[]], -1] if col.startswith['-'] else [i[col.strip[]], 1]] for col in columns ] def comparer[left, right]: comparer_iter = [ cmp[fn[left], fn[right]] * mult for fn, mult in comparers ] return next[[result for result in comparer_iter if result], 0] return sorted[items, key=cmp_to_key[comparer]]
Các mã mẫu sau đây sử dụng danh sách các từ điển với các khóa chung. Mô -đun Pprint được sử dụng để làm cho đầu ra dễ đọc hơn.
- Bản in đẹp với pprint trong Python
import pprint
l = [{'Name': 'Alice', 'Age': 40, 'Point': 80},
{'Name': 'Bob', 'Age': 20},
{'Name': 'Charlie', 'Age': 30, 'Point': 70}]
Sắp xếp danh sách các từ điển làm tăng lỗi theo mặc định
Sắp xếp danh sách các từ điển [
from operator import itemgetter as i
from functools import cmp_to_key
def cmp[x, y]:
"""
Replacement for built-in function cmp that was removed in Python 3
Compare the two objects x and y and return an integer according to
the outcome. The return value is negative if x < y, zero if x == y
and strictly positive if x > y.
//portingguide.readthedocs.io/en/latest/comparisons.html#the-cmp-function
"""
return [x > y] - [x < y]
def multikeysort[items, columns]:
comparers = [
[[i[col[1:].strip[]], -1] if col.startswith['-'] else [i[col.strip[]], 1]]
for col in columns
]
def comparer[left, right]:
comparer_iter = [
cmp[fn[left], fn[right]] * mult
for fn, mult in comparers
]
return next[[result for result in comparer_iter if result], 0]
return sorted[items, key=cmp_to_key[comparer]]
6] bằng phương thức from operator import itemgetter as i
def multikeysort[items, columns]:
comparers = [
[[i[col[1:].strip[]], -1] if col.startswith['-'] else [i[col.strip[]], 1]]
for col in columns
]
def comparer[left, right]:
comparer_iter = [
cmp[fn[left], fn[right]] * mult
for fn, mult in comparers
]
return next[[result for result in comparer_iter if result], 0]
return sorted[items, cmp=comparer]
5 hoặc hàm from operator import itemgetter as i
def multikeysort[items, columns]:
comparers = [
[[i[col[1:].strip[]], -1] if col.startswith['-'] else [i[col.strip[]], 1]]
for col in columns
]
def comparer[left, right]:
comparer_iter = [
cmp[fn[left], fn[right]] * mult
for fn, mult in comparers
]
return next[[result for result in comparer_iter if result], 0]
return sorted[items, cmp=comparer]
6 làm tăng lỗi from operator import itemgetter as i
def multikeysort[items, columns]:
comparers = [
[[i[col[1:].strip[]], -1] if col.startswith['-'] else [i[col.strip[]], 1]]
for col in columns
]
def comparer[left, right]:
comparer_iter = [
cmp[fn[left], fn[right]] * mult
for fn, mult in comparers
]
return next[[result for result in comparer_iter if result], 0]
return sorted[items, cmp=comparer]
7 theo mặc định.Điều này là do từ điển không hỗ trợ so sánh với
import pprint
l = [{'Name': 'Alice', 'Age': 40, 'Point': 80},
{'Name': 'Bob', 'Age': 20},
{'Name': 'Charlie', 'Age': 30, 'Point': 70}]
0, import pprint
l = [{'Name': 'Alice', 'Age': 40, 'Point': 80},
{'Name': 'Bob', 'Age': 20},
{'Name': 'Charlie', 'Age': 30, 'Point': 70}]
1, v.v.# sorted[l]
# TypeError: '