Hướng dẫn how does python sorted () work? - python đã sắp xếp () hoạt động như thế nào?

Python sử dụng một thuật toán gọi là Timsort:

Timsort là một thuật toán sắp xếp lai, có nguồn gốc từ sắp xếp hợp nhất và sắp xếp chèn, được thiết kế để thực hiện tốt trên nhiều loại dữ liệu trong thế giới thực. Nó được phát minh bởi Tim Peters vào năm 2002 để sử dụng trong ngôn ngữ lập trình Python. Thuật toán tìm thấy các tập hợp con của dữ liệu đã được đặt hàng và sử dụng các tập hợp con để sắp xếp dữ liệu hiệu quả hơn. Điều này được thực hiện bằng cách hợp nhất một tập hợp con được xác định, được gọi là chạy, với các lần chạy hiện có cho đến khi các tiêu chí nhất định được đáp ứng. Timsort đã là thuật toán sắp xếp tiêu chuẩn của Python kể từ phiên bản 2.3. Bây giờ nó cũng được sử dụng để sắp xếp các mảng trong Java SE 7 và trên nền tảng Android.

Đã trả lời ngày 8 tháng 6 năm 2012 lúc 12:35Jun 8, 2012 at 12:35

Hướng dẫn how does python sorted () work? - python đã sắp xếp () hoạt động như thế nào?

4

Thuật toán sắp xếp được gọi là Timsort. Xem Timsort

Đã trả lời ngày 8 tháng 6 năm 2012 lúc 12:35Jun 8, 2012 at 12:35

Thuật toán sắp xếp được gọi là Timsort. Xem TimsortPierce

Piercepiierce2 silver badges8 bronze badges

Cách dễ nhất để sắp xếp là với hàm (danh sách) được sắp xếp, lấy một danh sách và trả về một danh sách mới với các yếu tố đó theo thứ tự được sắp xếp. Danh sách ban đầu không thay đổi.

  a = [5, 1, 4, 3]
  print(sorted(a))  ## [1, 3, 4, 5]
  print(a)  ## [5, 1, 4, 3]

Nó phổ biến nhất để truyền một danh sách vào hàm Sắp xếp (), nhưng trên thực tế, nó có thể lấy bất kỳ loại bộ sưu tập nào. Phương thức danh sách cũ hơn.sort () là một chi tiết thay thế dưới đây. Hàm Sắp xếp () có vẻ dễ sử dụng hơn so với Sắp xếp (), vì vậy tôi khuyên bạn nên sử dụng Sắp xếp ().

Hàm Sắp xếp () có thể được tùy chỉnh thông qua các đối số tùy chọn. Đối số tùy chọn được sắp xếp () đảo ngược = true, ví dụ: Sắp xếp (danh sách, đảo ngược = true), làm cho nó sắp xếp ngược.

  strs = ['aa', 'BB', 'zz', 'CC']
  print(sorted(strs))  ## ['BB', 'CC', 'aa', 'zz'] (case sensitive)
  print(sorted(strs, reverse=True))   ## ['zz', 'aa', 'CC', 'BB']

Tùy chỉnh sắp xếp với phím =

Để sắp xếp tùy chỉnh phức tạp hơn, Sắp xếp () sẽ sử dụng một chức năng "key =" chỉ định hàm "khóa" biến đổi từng phần tử trước khi so sánh. Hàm chính có giá trị 1 và trả về giá trị 1 và giá trị "proxy" được trả về được sử dụng để so sánh trong loại.

Ví dụ, với một 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 chiều 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 đó.

  strs = ['ccc', 'aaaa', 'd', 'bb']
  print(sorted(strs, key=len))  ## ['d', 'bb', 'ccc', 'aaaa']

Hướng dẫn how does python sorted () work? - python đã sắp xếp () hoạt động như thế nào?

Một ví dụ khác, chỉ định "str.lower" là chức năng chính là một cách để buộc phân loại để xử lý chữ hoa và chữ thường giống nhau:

  ## "key" argument specifying str.lower function to use for sorting
  print(sorted(strs, key=str.lower))  ## ['aa', 'BB', 'CC', 'zz']

Bạn cũng có thể chuyển sang MYFN của riêng mình làm chức năng chính, như thế này:

  ## Say we have a list of strings we want to sort by the last letter of the string.
  strs = ['xc', 'zb', 'yd' ,'wa']

  ## Write a little function that takes a string, and returns its last letter.
  ## This will be the key function (takes in 1 value, returns 1 value).
  def MyFn(s):
    return s[-1]

  ## Now pass key=MyFn to sorted() to sort by the last letter:
  print(sorted(strs, key=MyFn))  ## ['wa', 'zb', 'xc', 'yd']

Để sắp xếp phức tạp hơn như sắp xếp theo tên cuối cùng sau đó, bạn có thể sử dụng các hàm itemgetter hoặc agrgetter như:

  from operator import itemgetter

  # (first name, last name, score) tuples
  grade = [('Freddy', 'Frank', 3), ('Anil', 'Frank', 100), ('Anil', 'Wang', 24)]
  sorted(grade, key=itemgetter(1,0))
  # [('Anil', 'Frank', 100), ('Freddy', 'Frank', 3), ('Anil', 'Wang', 24)]

  sorted(grade, key=itemgetter(0,-1)) # Aha! -1 sorts by last name in reverse order.
  #[('Anil', 'Wang', 24), ('Anil', 'Frank', 100), ('Freddy', 'Frank', 3)]

Sắp xếp () phương thức

Thay thế cho Sắp xếp (), phương thức Sort () trên danh sách sắp xếp danh sách theo thứ tự tăng dần, ví dụ: list.sort (). Phương thức Sắp xếp () thay đổi danh sách cơ bản và trả về không, vì vậy hãy sử dụng nó như thế này:

  alist.sort()            ## correct
  alist = blist.sort()    ## Incorrect. sort() returns None

Trên đây là một sự hiểu lầm rất phổ biến với Sort () - nó * không trả về * danh sách được sắp xếp. Phương thức Sắp xếp () phải được gọi trong danh sách; Nó không hoạt động trên bất kỳ bộ sưu tập có thể khởi động nào (nhưng hàm Sắp xếp () ở trên hoạt động trên bất cứ điều gì). Phương thức Sort () có trước hàm Sắp xếp (), vì vậy bạn có thể sẽ thấy nó trong mã cũ hơn. Phương thức sort () không cần tạo một danh sách mới, vì vậy nó có thể nhanh hơn một chút trong trường hợp các yếu tố sắp xếp đã có trong danh sách.

Bộ dữ liệu

Một tuple là một nhóm kích thước cố định của các phần tử, chẳng hạn như một bản phối hợp (x, y). Các bộ dữ liệu giống như danh sách, ngoại trừ chúng là bất biến và không thay đổi kích thước (bộ dữ liệu không hoàn toàn bất biến vì một trong những yếu tố chứa có thể bị thay đổi). Tuples đóng một loại vai trò "cấu trúc" trong Python - một cách thuận tiện để vượt qua một chút các giá trị kích thước cố định, logic. Một hàm cần trả về nhiều giá trị chỉ có thể trả về một tuple của các giá trị. Ví dụ: nếu tôi muốn có một danh sách các tọa độ 3-D, đại diện Python tự nhiên sẽ là một danh sách các bộ dữ liệu, trong đó mỗi tuple là cỡ 3 giữ một nhóm (x, y, z).

Để tạo một tuple, chỉ cần liệt kê các giá trị trong ngoặc đơn được phân tách bằng dấu phẩy. Tuple "trống" chỉ là một cặp dấu ngoặc đơn trống. Truy cập các yếu tố trong một tuple giống như một danh sách - len (), [], cho, trong, v.v ... Tất cả đều hoạt động giống nhau.

  tuple = (1, 2, 'hi')
  print(len(tuple))  ## 3
  print(tuple[2])    ## hi
  tuple[2] = 'bye'  ## NO, tuples cannot be changed
  tuple = (1, 2, 'bye')  ## this works

Để tạo ra một tuple kích thước-1, phần tử đơn độc phải được theo sau bởi một dấu phẩy.

  tuple = ('hi',)   ## size-1 tuple

Đó là một trường hợp hài hước trong cú pháp, nhưng dấu phẩy là cần thiết để phân biệt tuple với trường hợp thông thường để đặt một biểu thức trong ngoặc đơn. Trong một số trường hợp, bạn có thể bỏ qua dấu ngoặc đơn và Python sẽ thấy từ dấu phẩy mà bạn có ý định.

Gán một tuple cho một tuple có kích thước giống hệt nhau của các tên biến gán tất cả các giá trị tương ứng. Nếu các bộ dữ liệu không có cùng kích thước, nó sẽ có lỗi. Tính năng này hoạt động cho danh sách quá.

  (x, y, z) = (42, 13, "hike")
  print(z)  ## hike
  (err_string, err_code) = Foo()  ## Foo() returns a length-2 tuple

Danh sách toàn diện (tùy chọn)

Danh sách toàn diện là một tính năng nâng cao hơn, tốt cho một số trường hợp nhưng không cần thiết cho các bài tập và không phải là thứ bạn cần học lúc đầu (tức là bạn có thể bỏ qua phần này). Hiểu danh sách là một cách nhỏ gọn để viết một biểu thức mở rộng đến toàn bộ danh sách. Giả sử chúng ta có danh sách NUMS [1, 2, 3, 4], đây là danh sách hiểu để tính danh sách các hình vuông của họ [1, 4, 9, 16]:

  strs = ['aa', 'BB', 'zz', 'CC']
  print(sorted(strs))  ## ['BB', 'CC', 'aa', 'zz'] (case sensitive)
  print(sorted(strs, reverse=True))   ## ['zz', 'aa', 'CC', 'BB']
0

Cú pháp là

  strs = ['aa', 'BB', 'zz', 'CC']
  print(sorted(strs))  ## ['BB', 'CC', 'aa', 'zz'] (case sensitive)
  print(sorted(strs, reverse=True))   ## ['zz', 'aa', 'CC', 'BB']
3-
  strs = ['aa', 'BB', 'zz', 'CC']
  print(sorted(strs))  ## ['BB', 'CC', 'aa', 'zz'] (case sensitive)
  print(sorted(strs, reverse=True))   ## ['zz', 'aa', 'CC', 'BB']
4 trông giống như một vòng lặp thường xuyên, nhưng không có đại tràng (:). Expr bên trái của nó được đánh giá một lần cho mỗi phần tử để cung cấp các giá trị cho danh sách mới. Dưới đây là một ví dụ với các chuỗi, trong đó mỗi chuỗi được thay đổi thành trường hợp trên với '!!!' Được thêm vào:

  strs = ['aa', 'BB', 'zz', 'CC']
  print(sorted(strs))  ## ['BB', 'CC', 'aa', 'zz'] (case sensitive)
  print(sorted(strs, reverse=True))   ## ['zz', 'aa', 'CC', 'BB']
1

Bạn có thể thêm một bài kiểm tra nếu bên phải của vòng lặp để thu hẹp kết quả. Bài kiểm tra IF được đánh giá cho từng phần tử, chỉ bao gồm các phần tử trong đó thử nghiệm là đúng.

  strs = ['aa', 'BB', 'zz', 'CC']
  print(sorted(strs))  ## ['BB', 'CC', 'aa', 'zz'] (case sensitive)
  print(sorted(strs, reverse=True))   ## ['zz', 'aa', 'CC', 'BB']
2

Bài tập: list1.py

Để thực hành tài liệu trong phần này, hãy thử các vấn đề sau trong List1.Py sử dụng phân loại và bộ dữ liệu (trong các bài tập cơ bản).list1.py that use sorting and tuples (in the Basic Exercises).

Làm thế nào để Python thực hiện được sắp xếp?

Python sử dụng một thuật toán có tên TIMSORT: TIMSORT là một thuật toán sắp xếp lai, có nguồn gốc từ sắp xếp hợp nhất và sắp xếp chèn, được thiết kế để thực hiện tốt trên nhiều loại dữ liệu trong thế giới thực. Nó được phát minh bởi Tim Peters vào năm 2002 để sử dụng trong ngôn ngữ lập trình Python.uses an algorithm called Timsort: Timsort is a hybrid sorting algorithm, derived from merge sort and insertion sort, designed to perform well on many kinds of real-world data. It was invented by Tim Peters in 2002 for use in the Python programming language.

Sự khác biệt là loại () và Sắp xếp () trong Python là gì?

Sự khác biệt chính giữa sắp xếp và được sắp xếp trong Python là hàm sắp xếp không trả về không có gì và thay đổi chuỗi gốc, trong khi hàm Sắp xếp () tạo ra một loại chuỗi mới chứa phiên bản được sắp xếp của chuỗi đã cho.sort function returns nothing and makes changes to the original sequence, while the sorted () function creates a new sequence type containing a sorted version of the given sequence.

Thuật toán nào sắp xếp () sử dụng?

Thuật toán được sử dụng bởi sort () là phần giới thiệu.Introsort là một thuật toán sắp xếp lai sử dụng thuật toán sắp xếp ba để giảm thiểu thời gian chạy, nhanh chóng, phân loại Heapsort và chèn.IntroSort. Introsort being a hybrid sorting algorithm uses three sorting algorithm to minimize the running time, Quicksort, Heapsort and Insertion Sort.

Python có sắp xếp () ổn định không?

Sắp xếp ổn định - nếu hai mục có cùng một khóa, đơn đặt hàng của chúng sẽ được bảo tồn trong danh sách được sắp xếp.Các mặt hàng ban đầu không phải so sánh vì thứ tự của các bộ dữ liệu được trang trí sẽ được xác định nhiều nhất là hai mặt hàng đầu tiên. – if two items have the same key, their order will be preserved in the sorted list. The original items do not have to be comparable because the ordering of the decorated tuples will be determined by at most the first two items.