Làm thế nào để so sánh tuple hoạt động trong Python?


178

Tôi đã đọc cuốn sách lập trình Core Python và tác giả cho thấy một ví dụ như:

(4, 5) < (3, 5) # Equals false

Vì vậy, tôi tự hỏi, làm thế nào / tại sao nó bằng sai? Làm thế nào để trăn so sánh hai bộ dữ liệu này?

Btw, nó không được giải thích trong cuốn sách.

Câu trả lời:


191

Các bộ dữ liệu được so sánh vị trí theo vị trí: mục đầu tiên của bộ thứ nhất được so sánh với mục đầu tiên của bộ thứ hai; nếu chúng không bằng nhau (tức là cái đầu tiên lớn hơn hoặc nhỏ hơn cái thứ hai) thì đó là kết quả của sự so sánh, nếu không thì mục thứ hai được xem xét, sau đó là mục thứ ba, v.v.

Xem các hoạt động trình tự phổ biến :

Trình tự cùng loại cũng hỗ trợ so sánh. Cụ thể, các bộ dữ liệu và danh sách được so sánh theo từ vựng bằng cách so sánh các yếu tố tương ứng. Điều này có nghĩa là để so sánh bằng nhau, mọi phần tử phải so sánh bằng nhau và hai chuỗi phải cùng loại và có cùng độ dài.

Ngoài ra giá trị so sánh để biết thêm chi tiết:

So sánh thuật ngữ giữa các bộ sưu tập tích hợp hoạt động như sau:

  • Để hai bộ sưu tập so sánh bằng nhau, chúng phải cùng loại, có cùng độ dài và mỗi cặp phần tử tương ứng phải so sánh bằng nhau (ví dụ: [1,2] == (1,2)là sai vì loại không giống nhau).
  • Các bộ sưu tập hỗ trợ so sánh thứ tự được sắp xếp giống như các phần tử không bằng nhau đầu tiên của chúng (ví dụ: [1,2,x] <= [1,2,y]có cùng giá trị như x <= y). Nếu một phần tử tương ứng không tồn tại, bộ sưu tập ngắn hơn được đặt hàng trước (ví dụ, [1,2] < [1,2,3]là đúng).

Nếu không bằng nhau, các chuỗi được sắp xếp giống như các yếu tố khác nhau đầu tiên của chúng. Ví dụ: cmp ([1,2, x], [1,2, y]) trả về giống như cmp (x, y). Nếu phần tử tương ứng không tồn tại, chuỗi ngắn hơn được coi là nhỏ hơn (ví dụ: [1,2] <[1,2,3] trả về True).

Lưu ý 1 : <>không có nghĩa là "nhỏ hơn" và "lớn hơn" nhưng "là trước" và "là sau": vì vậy (0, 1) "là trước" (1, 0).

Lưu ý 2 : các bộ dữ liệu không được coi là vectơ trong không gian n chiều , so với chiều dài của chúng.

Lưu ý 3 : đề cập đến câu hỏi /programming/36911617/python-2-tuple-comparison : đừng nghĩ rằng một tuple là "lớn hơn" chỉ khi bất kỳ yếu tố nào của đầu tiên lớn hơn tương ứng một trong hai


4
Điều này có thể gây hiểu nhầm khi nói về <>. Ví dụ, (0, 1) < (1, 0)đánh giá để True.
Không có

4
@CMCDragonkai - vâng. thử: x = tuple([0 for _ in range(n)])và làm tương tự cho y. Đặt n = 100, 1000, 10.000 và 100.000 và chạy %timeit x==ycho các giá trị thời gian lần lượt là 0,5, 4,6, 43,9 và 443 micro giây, gần bằng với O (n) như bạn thực tế có thể nhận được.
Michael Scott Cuthbert

8
@ J.Money tại sao bạn nghĩ nó có thể gây hiểu nhầm?
Don

1
@CharlieParker <>không có nghĩa là "nhỏ hơn" và "lớn hơn sau đó" nhưng "đến trước" và "đến sau": vì vậy (0, 1)"đến trước"(1, 0)
Don

3
@Don Tôi đoán nó không rõ ràng cho chúng tôi loại đặt hàng để áp đặt cho một tuple. Tôi đoán con trăn chỉ coi nó là những con số bằng cách kiểm tra chữ số có nghĩa lớn nhất trước tiên và chuyển sang phá vỡ ... (theo một yếu tố khôn ngoan)
Charlie Parker

20

Các tài liệu Python không giải thích nó.

Các bộ và danh sách được so sánh theo từ vựng bằng cách sử dụng so sánh các yếu tố tương ứng. Điều này có nghĩa là để so sánh bằng nhau, mỗi phần tử phải so sánh bằng nhau và hai chuỗi phải cùng loại và có cùng độ dài.


Trang hiện được liên kết từ câu trả lời này dường như không chứa văn bản được trích dẫn.
cắm

0

Các python 2.5 tài liệu giải thích nó tốt.

Các bộ và danh sách được so sánh theo từ vựng bằng cách sử dụng so sánh các yếu tố tương ứng. Điều này có nghĩa là để so sánh bằng nhau, mỗi phần tử phải so sánh bằng nhau và hai chuỗi phải cùng loại và có cùng độ dài.

Nếu không bằng nhau, các chuỗi được sắp xếp giống như các yếu tố khác nhau đầu tiên của chúng. Ví dụ: cmp ([1,2, x], [1,2, y]) trả về giống như cmp (x, y). Nếu phần tử tương ứng không tồn tại, chuỗi ngắn hơn được sắp xếp trước (ví dụ: [1,2] <[1,2,3]).

Thật không may, trang đó dường như đã biến mất trong tài liệu cho các phiên bản gần đây hơn.


0
Tôi đã có một số nhầm lẫn trước khi liên quan đến số nguyên, vì vậy tôi sẽ giải thích nó thân thiện với người mới bắt đầu hơn với một ví dụ

a = ('A','B','C') # see it as the string "ABC" b = ('A','B','D')

A được chuyển đổi thành ASCII tương ứng của nó ord('A') #65cho các phần tử khác

Vì vậy, >> a>b # True bạn có thể nghĩ về nó như là so sánh giữa các chuỗi (Chính xác là như vậy)

điều tương tự cũng xảy ra với số nguyên.

x = (1,2,2) # see it the string "123" y = (1,2,3) x > y # False

bởi vì (1 không lớn hơn 1, di chuyển sang tiếp theo, 2 không lớn hơn 2, di chuyển sang 2 tiếp theo nhỏ hơn ba chiều theo phương pháp -)

Điểm chính được đề cập trong câu trả lời ở trên

nghĩ về nó như là một phần tử nằm trước một phần tử khác theo thứ tự abc không lớn hơn một phần tử và trong trường hợp này coi tất cả các phần tử tuple là một chuỗi.


2
(1,2,3) > (1,2,2)choTrue
Vishal Singh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.