Hướng dẫn python sort list of dictionary by multiple values - python sắp xếp danh sách từ điển theo nhiều giá trị

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ố
    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
  • Chỉ định
    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]]
    
    2 cho 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
  • Sắp xếp theo nhiều phím
  • 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]]
    
    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ển

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: '

Chủ Đề