Hướng dẫn python sort list by custom condition - danh sách sắp xếp python theo điều kiện tùy chỉnh

Tôi chưa quen với Python. Tôi muốn sắp xếp một danh sách với điều kiện nhất định. Ví dụ:

Tôi đang nhận được các chi tiết môi trường và lưu trữ chúng như danh sách như dưới đây.

>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
2 Họ có thể là bất kỳ đơn đặt hàng nào.
>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
3

Nhưng danh sách kết quả phải là:

rls = ['prod','qa','uat','dev']

Hướng dẫn python sort list by custom condition - danh sách sắp xếp python theo điều kiện tùy chỉnh

Vô hiệu hóa

20.4K7 Huy hiệu vàng34 Huy hiệu bạc59 Huy hiệu đồng7 gold badges34 silver badges59 bronze badges

Hỏi ngày 24 tháng 4 năm 2015 lúc 19:04Apr 24, 2015 at 19:04

2

Bạn có thể sử dụng hàm so sánh tùy chỉnh, như được mô tả trong https://wiki.python.org/moin/howto/sorting#the_old_way_using_the_cmp_parameter.

Hoặc bạn có thể sử dụng chức năng khóa (bằng cách chuyển đối số từ khóa

>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
4 cho list.sort) để chuyển đổi giá trị được sắp xếp thành một đối số khác:

>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>

hoặc làm điều tương tự với một chức năng:

>>> def my_key_func(x):
...     if x=='dev':
...         return (1,x)
...     else:
...         return (0,x)
...
>>> ls.sort(key=my_key_func)
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>

Đã trả lời ngày 24 tháng 4 năm 2015 lúc 19:21Apr 24, 2015 at 19:21

ferrifferrifferri

17.3k5 Huy hiệu vàng42 Huy hiệu bạc87 Huy hiệu đồng5 gold badges42 silver badges87 bronze badges

3

Afaik, bạn có thể xác định các hàm Lambda tùy chỉnh và gửi chúng làm đối số chính cho hàm được sắp xếp trong Python như:

Sắp xếp (danh sách, key = lambdafn)

Lambda FN này nên có giá trị trả lại boolean, sẽ không hoạt động khác.

Cuối cùng đã nắm giữ tài liệu, xem thêm tại đây: https://wiki.python.org/moin/howto/sorting/

Tái bút: Xin lỗi về phong cách trả lời kém, lần đầu tiên trả lời ở như vậy

Đã trả lời ngày 24 tháng 4 năm 2015 lúc 19:16Apr 24, 2015 at 19:16

Trong khoa học máy tính, một thuật toán sắp xếp đặt các yếu tố của một danh sách vào một thứ tự cụ thể. Chúng rất quan trọng vì chúng thường làm giảm sự phức tạp của một vấn đề. Hãy cùng khám phá cách sử dụng các chức năng sắp xếp tùy chỉnh để thực hiện các đơn đặt hàng và so sánh tùy chỉnh trong Python.

Trong bài viết trước của tôi về làm việc với các luồng trong Python, tôi đã giới thiệu ngắn gọn các phương thức sắp xếp với danh sách.sort () và Sắp xếp (). Cả

>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
5 và
>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
6 đều có tham số chính chỉ định hàm được gọi trên mỗi phần tử danh sách trước khi so sánh.

Trong bài viết này, tôi muốn đi xa hơn về chủ đề sắp xếp và khám phá cách viết một chức năng sắp xếp tùy chỉnh trong Python. Nói cách khác, tôi sẽ giải thích cách sử dụng hàm Lambda tùy chỉnh làm tham số chính.

Nếu bạn không thoải mái với các chức năng Python, bạn nên đọc cách xác định một chức năng trong Python trước khi đi sâu hơn vào bài viết này.

Sắp xếp với chức năng sắp xếp tùy chỉnh trong Python

Đầu tiên, hãy để nói về sự khác biệt giữa

>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
7 và
>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
6. Về mặt cú pháp,
>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
7 là một phương thức thể hiện được thực hiện là
>>> def my_key_func(x):
...     if x=='dev':
...         return (1,x)
...     else:
...         return (0,x)
...
>>> ls.sort(key=my_key_func)
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
0, trong khi
>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
6 được sử dụng là
>>> def my_key_func(x):
...     if x=='dev':
...         return (1,x)
...     else:
...         return (0,x)
...
>>> ls.sort(key=my_key_func)
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
2.

Một điều quan trọng cần lưu ý là

>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
7 sửa đổi trực tiếp biến ban đầu và do đó, thứ tự ban đầu sẽ bị mất.

Mặt khác,

>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
6 giữ một bản sao của biến ban đầu, giúp bạn có thể trở lại thứ tự ban đầu nếu cần. Bởi vì
>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
7 không tạo ra bất kỳ bản sao nào của biến ban đầu, nên nó hiệu quả hơn một chút so với
>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
6. Tuy nhiên, điều này đến với chi phí thuận tiện.

Cũng cần lưu ý rằng

>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
6 sẽ trả về một danh sách; Do đó, bạn phải gán đầu ra cho một biến mới.

Đối với

>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
5, nó sửa đổi danh sách tại chỗ và không có giá trị trả về. Cuối cùng nhưng không kém phần quan trọng,
>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
5 chỉ có thể hoạt động trong danh sách trong khi
>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
6 chấp nhận bất kỳ điều gì có thể.

Ví dụ: ở đây, một so sánh chuỗi không nhạy cảm trường hợp:

>>> sorted("LearnPython.com is awesome to learn about custom sort functions in Python".split(), key=str.lower)
['about', 'awesome', 'custom', 'functions', 'in', 'is'
 'Learn', 'LearnPython.com', 'Python', 'sort', 'to']

Lưu ý: Thông thường việc chuyển chức năng Lambda tùy chỉnh như một tham số chính để sắp xếp các đối tượng phức tạp trong Python. It is common to pass a custom lambda function as a key parameter to sort complex objects in Python.

Bây giờ, hãy để nói về các chức năng sắp xếp tùy chỉnh trong Python. Trong Python, chúng ta có thể viết các chức năng sắp xếp tùy chỉnh hoạt động với

>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
7 và
>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
6.

Giá trị của tham số chính phải là một hàm có một đối số duy nhất và trả về

>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
4 cho mục đích sắp xếp. Bởi vì hàm chính chỉ được gọi một lần cho mỗi bản ghi đầu vào, đây là một cách hiệu quả để thực hiện phân loại trong Python.

Một mẫu phổ biến là sắp xếp các đối tượng phức tạp bằng cách sử dụng một số chỉ số đối tượng là

>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
4. Ví dụ: chúng ta có thể xác định một đơn đặt hàng tùy chỉnh để sắp xếp danh sách các bộ dữ liệu:

>>> pokemon = [
...    ('Charmander', 'Fire', 52),
...    ('Blastoise', 'Water', 83),
...    ('Beedrill', 'Poison', 90),
... ]
>>> sorted(pokemon, key=lambda x: x[2])   # sort by attack power
[('Charmander', 'Fire', 52),
 ('Blastoise', 'Water', 83),
 ('Beedrill', 'Poison', 90)]

Nó cũng hoạt động cho các đối tượng có thuộc tính tên:

>>> class Pokemon:
...    def __init__(self, name, category, attack):
...        self.name = name
...        self.category = category
...        self.attack = attack
...    def __repr__(self):
...        return repr((self.name, self.category, self.attack))



>>> pokemon_objects = [
...    Pokemon('Beedrill', 'Poison', 90),
...    Pokemon('Charmander', 'Fire', 52),
...    Pokemon('Blastoise', 'Water', 83),
...            ]
>>> sorted(pokemon_objects, key=lambda x: x.attack)   # sort by attack
[('Charmander', 'Fire', 52),
 ('Blastoise', 'Water', 83),
 ('Beedrill', 'Poison', 90)]

Bạn có thể tìm hiểu thêm về các đối tượng tùy chỉnh trong Python trong bài viết Các bước đơn giản để tạo lớp của riêng bạn trong Python.

Biết cách thao tác dữ liệu, viết các chức năng sắp xếp tùy chỉnh trong Python và thực hiện các so sánh tùy chỉnh là những kỹ năng cần thiết để làm chủ. Giới thiệu của chúng tôi về Python cho khoa học dữ liệu là một cách tuyệt vời để chọn bộ kỹ năng theo yêu cầu này.

So sánh tùy chỉnh với chức năng sắp xếp trong Python

Bạn cũng có thể sử dụng

>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
6 với bộ so sánh tùy chỉnh làm tham số của nó.

Trong Python 2,

>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
6 có thể được triển khai với bộ so sánh tùy chỉnh,
>>> sorted("LearnPython.com is awesome to learn about custom sort functions in Python".split(), key=str.lower)
['about', 'awesome', 'custom', 'functions', 'in', 'is'
 'Learn', 'LearnPython.com', 'Python', 'sort', 'to']
7 hoặc tham số
>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
4.

Điều quan trọng cần lưu ý là

>>> sorted("LearnPython.com is awesome to learn about custom sort functions in Python".split(), key=str.lower)
['about', 'awesome', 'custom', 'functions', 'in', 'is'
 'Learn', 'LearnPython.com', 'Python', 'sort', 'to']
7 cần vượt qua hai tham số (x và y) là các phần của danh sách. Nó sẽ trả về một số với logic sau:

  • Nếu nó trả về một số dương: x> y
  • Nếu nó trả về 0: x == y
  • Nếu nó trả về một số âm: x

Tuy nhiên,

>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
4 nhận được một tham số, tính toán kết quả và sau đó sử dụng tính toán để sắp xếp và so sánh. Điều này có nghĩa là trong Python 2, bạn có thể sắp xếp một danh sách các số theo giá trị khối của chúng theo hai cách khác nhau:

>>> l = [6, 8, 10, 23, -4, -7]
>>> # The cmp parameter has been removed in Python 3
>>> sorted_l = sorted(l, cmp=lambda x, y: x ** 3 - y ** 3) # Sort with cmp
>>> sorted_l = sorted(l, key=lambda x: x ** 3) # Sort with key
>>> print(sorted_l)
[-7, -4, 6, 8, 10, 23]

Trong Python 3, tham số

>>> sorted("LearnPython.com is awesome to learn about custom sort functions in Python".split(), key=str.lower)
['about', 'awesome', 'custom', 'functions', 'in', 'is'
 'Learn', 'LearnPython.com', 'Python', 'sort', 'to']
7 đã bị xóa, chủ yếu vì hai lý do.

Đầu tiên, mọi thứ được thực hiện với

>>> sorted("LearnPython.com is awesome to learn about custom sort functions in Python".split(), key=str.lower)
['about', 'awesome', 'custom', 'functions', 'in', 'is'
 'Learn', 'LearnPython.com', 'Python', 'sort', 'to']
7 có thể được thực hiện với
>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
4. Thứ hai,
>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
4 nhanh hơn
>>> sorted("LearnPython.com is awesome to learn about custom sort functions in Python".split(), key=str.lower)
['about', 'awesome', 'custom', 'functions', 'in', 'is'
 'Learn', 'LearnPython.com', 'Python', 'sort', 'to']
7. Khi
>>> sorted("LearnPython.com is awesome to learn about custom sort functions in Python".split(), key=str.lower)
['about', 'awesome', 'custom', 'functions', 'in', 'is'
 'Learn', 'LearnPython.com', 'Python', 'sort', 'to']
7 được truyền dưới dạng tham số, thuật toán sắp xếp so sánh các cặp giá trị và hàm so sánh được gọi là nhiều lần cho mỗi mục.

Mặt khác, khóa chỉ thực hiện tính toán một lần. Do đó, sự phức tạp được giảm. Điều này làm cho mã ít bị lỗi, vì cú pháp được đơn giản hóa. .

Nếu bạn quen thuộc với Java hoặc C ++, bạn có thể quen thuộc với

>>> sorted("LearnPython.com is awesome to learn about custom sort functions in Python".split(), key=str.lower)
['about', 'awesome', 'custom', 'functions', 'in', 'is'
 'Learn', 'LearnPython.com', 'Python', 'sort', 'to']
7 hơn
>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
4. Trên thực tế, trong Python 3, bạn có thể sử dụng
>>> sorted("LearnPython.com is awesome to learn about custom sort functions in Python".split(), key=str.lower)
['about', 'awesome', 'custom', 'functions', 'in', 'is'
 'Learn', 'LearnPython.com', 'Python', 'sort', 'to']
7 với
>>> class Pokemon:
...    def __init__(self, name, category, attack):
...        self.name = name
...        self.category = category
...        self.attack = attack
...    def __repr__(self):
...        return repr((self.name, self.category, self.attack))



>>> pokemon_objects = [
...    Pokemon('Beedrill', 'Poison', 90),
...    Pokemon('Charmander', 'Fire', 52),
...    Pokemon('Blastoise', 'Water', 83),
...            ]
>>> sorted(pokemon_objects, key=lambda x: x.attack)   # sort by attack
[('Charmander', 'Fire', 52),
 ('Blastoise', 'Water', 83),
 ('Beedrill', 'Poison', 90)]

0, sẽ chuyển đổi
>>> sorted("LearnPython.com is awesome to learn about custom sort functions in Python".split(), key=str.lower)
['about', 'awesome', 'custom', 'functions', 'in', 'is'
 'Learn', 'LearnPython.com', 'Python', 'sort', 'to']
7 thành
>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
4. Hãy khám phá điều này nhiều hơn trong phần tiếp theo.

Các chức năng sắp xếp tùy chỉnh trong Python với functools.cmp_to_key (Func)

functools.cmp_to_key (FUNC) được sử dụng để chuyển đổi hàm so sánh kiểu cũ thành hàm chính. Nó có sẵn trong Python 2.7, Python 3.2 và sau đó.

Theo tài liệu Python 3, hàm so sánh là bất kỳ khả năng gọi nào chấp nhận hai đối số, so sánh chúng và trả về một số âm cho ít hơn, bằng không về bình đẳng hoặc số dương cho lớn hơn. Hàm

>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
4 là một hàm có thể gọi được chấp nhận một đối số và trả về một giá trị khác sẽ được sử dụng làm loại
>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
4.

Trước Python 2.4, không có Sắp xếp () và list.sort () & nbsp; Không có đối số từ khóa. Thay vào đó, Python 2 đã hỗ trợ tham số

>>> sorted("LearnPython.com is awesome to learn about custom sort functions in Python".split(), key=str.lower)
['about', 'awesome', 'custom', 'functions', 'in', 'is'
 'Learn', 'LearnPython.com', 'Python', 'sort', 'to']
7 để xử lý các hàm so sánh do người dùng chỉ định.

Khi chuyển mã từ Python 2 sang Python 3, bạn có thể phải chuyển đổi hàm từ

>>> sorted("LearnPython.com is awesome to learn about custom sort functions in Python".split(), key=str.lower)
['about', 'awesome', 'custom', 'functions', 'in', 'is'
 'Learn', 'LearnPython.com', 'Python', 'sort', 'to']
7 thành
>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
4. Trong Python 3,
>>> class Pokemon:
...    def __init__(self, name, category, attack):
...        self.name = name
...        self.category = category
...        self.attack = attack
...    def __repr__(self):
...        return repr((self.name, self.category, self.attack))



>>> pokemon_objects = [
...    Pokemon('Beedrill', 'Poison', 90),
...    Pokemon('Charmander', 'Fire', 52),
...    Pokemon('Blastoise', 'Water', 83),
...            ]
>>> sorted(pokemon_objects, key=lambda x: x.attack)   # sort by attack
[('Charmander', 'Fire', 52),
 ('Blastoise', 'Water', 83),
 ('Beedrill', 'Poison', 90)]

0 đã được giới thiệu để tạo điều kiện cho quá trình này.

Chúng tôi sẽ sử dụng

>>> class Pokemon:
...    def __init__(self, name, category, attack):
...        self.name = name
...        self.category = category
...        self.attack = attack
...    def __repr__(self):
...        return repr((self.name, self.category, self.attack))



>>> pokemon_objects = [
...    Pokemon('Beedrill', 'Poison', 90),
...    Pokemon('Charmander', 'Fire', 52),
...    Pokemon('Blastoise', 'Water', 83),
...            ]
>>> sorted(pokemon_objects, key=lambda x: x.attack)   # sort by attack
[('Charmander', 'Fire', 52),
 ('Blastoise', 'Water', 83),
 ('Beedrill', 'Poison', 90)]

0 với các chức năng chấp nhận các chức năng chính như
>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
6 hoặc
>>> l = [6, 8, 10, 23, -4, -7]
>>> # The cmp parameter has been removed in Python 3
>>> sorted_l = sorted(l, cmp=lambda x, y: x ** 3 - y ** 3) # Sort with cmp
>>> sorted_l = sorted(l, key=lambda x: x ** 3) # Sort with key
>>> print(sorted_l)
[-7, -4, 6, 8, 10, 23]
1, mà tôi đã nói trong bài viết trước của tôi. Sử dụng ví dụ trước của chúng tôi để sắp xếp các số theo giá trị khối của chúng, bạn có thể viết hàm
>>> sorted("LearnPython.com is awesome to learn about custom sort functions in Python".split(), key=str.lower)
['about', 'awesome', 'custom', 'functions', 'in', 'is'
 'Learn', 'LearnPython.com', 'Python', 'sort', 'to']
7 tùy chỉnh như sau:

>>> import functools

>>> l = [6, 8, 10, 23, -4, -7]

>>> def compare(x, y):
...    return x ** 3 - y ** 3

>>> sorted_l = sorted(l, key=functools.cmp_to_key(compare))
>>> print(sorted_l)
[-7, -4, 6, 8, 10, 23]

Đôi khi, sử dụng khóa có thể ít rõ ràng hơn

>>> sorted("LearnPython.com is awesome to learn about custom sort functions in Python".split(), key=str.lower)
['about', 'awesome', 'custom', 'functions', 'in', 'is'
 'Learn', 'LearnPython.com', 'Python', 'sort', 'to']
7. Trong trường hợp này, có thể tốt hơn là sử dụng
>>> class Pokemon:
...    def __init__(self, name, category, attack):
...        self.name = name
...        self.category = category
...        self.attack = attack
...    def __repr__(self):
...        return repr((self.name, self.category, self.attack))



>>> pokemon_objects = [
...    Pokemon('Beedrill', 'Poison', 90),
...    Pokemon('Charmander', 'Fire', 52),
...    Pokemon('Blastoise', 'Water', 83),
...            ]
>>> sorted(pokemon_objects, key=lambda x: x.attack)   # sort by attack
[('Charmander', 'Fire', 52),
 ('Blastoise', 'Water', 83),
 ('Beedrill', 'Poison', 90)]

0, vì nó có thể dễ đọc và trực quan hơn.

Ví dụ, trong năm ngoái, Matur Matura (một kỳ thi Ba Lan tương tự như A, Abitur hoặc Baccalauréat), phần CNTT tùy chọn có một bài tập bao gồm điều này:

Cặp (Số1, Word1) nhỏ hơn cặp (Số 2, Word2) IF:smaller than pair (number2, word2) if:

  • Số1

Or:

  • Number1 == number2 và word1 nhỏ hơn bảng chữ cái so với word2.

Ví dụ, cặp (1, BBBB) nhỏ hơn cặp (2, AAA), nhưng cặp (3, AAA) nhỏ hơn cặp (3, AB).

Nói cách khác, chúng tôi muốn cặp được sắp xếp theo thứ tự tăng dần trên phần tử thứ nhất và phần tử thứ hai.

Do đó, chúng tôi hy vọng các cặp sẽ được trả lại theo thứ tự sau: & nbsp; (1, BBBB), (2, AAA), (3, AAA), (3, AB).(1, bbbb), (2, aaa), (3, aaa), (3, ab).

Dưới đây là hàm

>>> sorted("LearnPython.com is awesome to learn about custom sort functions in Python".split(), key=str.lower)
['about', 'awesome', 'custom', 'functions', 'in', 'is'
 'Learn', 'LearnPython.com', 'Python', 'sort', 'to']
7 tùy chỉnh để giải quyết vấn đề này:

from functools import cmp_to_key

def compare(pair1, pair2):
	number1, word1 = pair1
	number2, word2 = pair2
	if number1 == number2:
		if word1 < word2:
			return -1
		else:
			return 1
	if number1 < number2:
		return -1
	else:
		return 1

compare_key = cmp_to_key(compare)

Nhưng ngay cả trong trường hợp này, chúng ta có thể giải quyết vấn đề với

>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
4 bằng cách sắp xếp một danh sách các bộ dữ liệu:

>>> # List of tuples
>>> l = [(3, 'aaa'), (1, 'bbbb'), (3, 'ab'), (2, 'aaa')]

>>> # Sort with key on first and second element of each tuple
>>> sorted(l, key = lambda x: (x[0], x[1])) 
[(1, 'bbbb'), (2, 'aaa'), (3, 'aaa'), (3, 'ab')]

Chúng ta cũng có thể cố gắng làm cho vấn đề trở nên khó khăn hơn bằng cách sắp xếp yếu tố đầu tiên theo thứ tự giảm dần và phần thứ hai theo thứ tự tăng dần. Một lần nữa, chúng ta có thể giải quyết nó bằng

>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
4:

>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
0

Giả sử chúng ta xoay chuyển vấn đề theo cách khác, với yếu tố đầu tiên theo thứ tự tăng dần và thứ hai theo thứ tự giảm dần. Trong trường hợp này, việc vượt qua tham số

>>> l = [6, 8, 10, 23, -4, -7]
>>> # The cmp parameter has been removed in Python 3
>>> sorted_l = sorted(l, cmp=lambda x, y: x ** 3 - y ** 3) # Sort with cmp
>>> sorted_l = sorted(l, key=lambda x: x ** 3) # Sort with key
>>> print(sorted_l)
[-7, -4, 6, 8, 10, 23]
8 là
>>> l = [6, 8, 10, 23, -4, -7]
>>> # The cmp parameter has been removed in Python 3
>>> sorted_l = sorted(l, cmp=lambda x, y: x ** 3 - y ** 3) # Sort with cmp
>>> sorted_l = sorted(l, key=lambda x: x ** 3) # Sort with key
>>> print(sorted_l)
[-7, -4, 6, 8, 10, 23]
9 sẽ giải quyết nó.

>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
1

Thật khó khăn khi tìm thấy một trường hợp mà

>>> sorted("LearnPython.com is awesome to learn about custom sort functions in Python".split(), key=str.lower)
['about', 'awesome', 'custom', 'functions', 'in', 'is'
 'Learn', 'LearnPython.com', 'Python', 'sort', 'to']
7 không thể được thay thế bằng
>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
4. Bởi vì hiệu suất
>>> class Pokemon:
...    def __init__(self, name, category, attack):
...        self.name = name
...        self.category = category
...        self.attack = attack
...    def __repr__(self):
...        return repr((self.name, self.category, self.attack))



>>> pokemon_objects = [
...    Pokemon('Beedrill', 'Poison', 90),
...    Pokemon('Charmander', 'Fire', 52),
...    Pokemon('Blastoise', 'Water', 83),
...            ]
>>> sorted(pokemon_objects, key=lambda x: x.attack)   # sort by attack
[('Charmander', 'Fire', 52),
 ('Blastoise', 'Water', 83),
 ('Beedrill', 'Poison', 90)]

0 rất chậm so với
>>> ls = ['qa','uat','prod','dev']
>>> ls.sort(key=lambda x: (1,x) if x=='dev' else (0,x))
>>> ls
['prod', 'qa', 'uat', 'dev']
>>>
4, nên nó chỉ nên được sử dụng như là phương sách cuối cùng để thực hiện chức năng sắp xếp tùy chỉnh trong Python.

Nếu bạn muốn biết thêm về các chức năng ánh xạ, hãy xem bài viết của tôi trên Filter (), map () và giảm ().

Đóng suy nghĩ về các chức năng sắp xếp tùy chỉnh trong Python

Trong bài viết này, chúng tôi đã khám phá cách thực hiện các chức năng sắp xếp và so sánh tùy chỉnh trong Python. Chúng tôi đã học được một chút lịch sử Python và cố gắng hiểu các lựa chọn được thực hiện với

>>> sorted("LearnPython.com is awesome to learn about custom sort functions in Python".split(), key=str.lower)
['about', 'awesome', 'custom', 'functions', 'in', 'is'
 'Learn', 'LearnPython.com', 'Python', 'sort', 'to']
7 và chìa khóa giữa Python 2 và 3 để thực hiện các chức năng sắp xếp tùy chỉnh trong Python.

Để hiểu rõ hơn các khái niệm được giải thích trong các bài viết này, luôn luôn là một ý tưởng tốt để chơi với đoạn mã và xây dựng các ví dụ của riêng bạn.

Cuối cùng, nếu bạn muốn tìm hiểu thêm về thao tác dữ liệu trong Python, hãy thoải mái kiểm tra bài viết tuyệt vời của Yigit, về cách lọc hàng và chọn các cột trong khung dữ liệu Python với gấu trúc.

Và nếu bạn muốn đưa mọi thứ lên một tầm cao mới, hãy thử bài hát Python for Data Science của chúng tôi. Học hỏi!

Làm thế nào để bạn sắp xếp một danh sách theo tùy chỉnh Python?

Sắp xếp tùy chỉnh với phím = ví dụ với danh sách các chuỗi, chỉ định khóa = Len (hàm tích hợp trong len ()) sắp xếp các chuỗi theo độ dài, từ ngắn nhất đến dài nhất. Sắp xếp gọi Len () cho mỗi chuỗi để có được danh sách các giá trị độ dài proxy, sau đó sắp xếp các giá trị proxy đó.specifying key=len (the built in len() function) sorts the strings by length, from shortest to longest. The sort calls len() for each string to get the list of proxy length values, and then sorts with those proxy values.

Làm thế nào để bạn sắp xếp theo điều kiện trong Python?

Sắp xếp (key = len), đối số chính phải là một hàm có trong 1 đối số.Bất cứ điều gì chức năng này trả về sẽ là điều kiện mà Python sẽ sắp xếp danh sách của chúng tôi theo. , the key argument must be a function that takes in 1 argument. Whatever this function returns will be the condition that Python will sort our list by.

Làm thế nào để bạn sắp xếp với hai điều kiện?

Dưới đây là các bước để phân loại đa cấp bằng hộp thoại:..
Chọn toàn bộ tập dữ liệu mà bạn muốn sắp xếp ..
Nhấp vào tab Dữ liệu ..
Nhấp vào biểu tượng sắp xếp (một hình dưới đây).....
Trong hộp thoại sắp xếp, thực hiện các lựa chọn sau.....
Nhấp vào Thêm cấp độ (điều này sẽ thêm một cấp độ khác của các tùy chọn sắp xếp) ..

Cách nhanh nhất để sắp xếp một danh sách trong Python là gì?

Để tóm tắt lại thí nghiệm của chúng tôi, đây là các thuật toán sắp xếp hàng đầu trong Python được xếp hạng nhanh nhất đến chậm nhất, được làm tròn đến thứ một hàng ngàn gần nhất:..
Sắp xếp tích hợp của Python: 0,009s ..
Sắp xếp radix: 0,220s ..
Quicksort: 0,247s ..
Sắp xếp vỏ: 0,250s ..
Sắp xếp hợp nhất: 0,435s ..
Sắp xếp đống: 0,473s ..
Đếm loại: 1.945s ..
Lựa chọn: 3.426s ..