Làm thế nào khi tôi thay đổi thứ tự của hai bộ trong các hợp nhất dưới đây, tôi nhận được kết quả khác nhau?
set1 = {1, 2, 3}
set2 = {True, False}
print(set1 | set2)
# {False, 1, 2, 3}
print(set2 | set1)
#{False, True, 2, 3}
Làm thế nào khi tôi thay đổi thứ tự của hai bộ trong các hợp nhất dưới đây, tôi nhận được kết quả khác nhau?
set1 = {1, 2, 3}
set2 = {True, False}
print(set1 | set2)
# {False, 1, 2, 3}
print(set2 | set1)
#{False, True, 2, 3}
Câu trả lời:
Các 1
và True
tương đương và được coi là bản sao. Tương tự như vậy 0
và False
cũng tương đương:
>>> 1 == True
True
>>> 0 == False
True
Khi gặp nhiều giá trị tương đương, các bộ giữ nguyên giá trị đầu tiên được nhìn thấy:
>>> {0, False}
{0}
>>> {False, 0}
{False}
Để chúng được coi là riêng biệt, chỉ cần cất chúng trong một (value, type)
cặp:
>>> set1 = {(1, int), (2, int), (3, int)}
>>> set2 = {(True, bool), (False, bool)}
>>> set1 | set2
{(3, <class 'int'>), (1, <class 'int'>), (2, <class 'int'>),
(True, <class 'bool'>), (False, <class 'bool'>)}
>>> set1 & set2
set()
Một cách khác để làm cho các giá trị khác biệt là lưu trữ chúng dưới dạng chuỗi:
>>> set1 = {'1', '2', '3'}
>>> set2 = {'True', 'False'}
>>> set1 | set2
{'2', '3', 'False', 'True', '1'}
>>> set1 & set2
set()
Hy vọng điều này làm sáng tỏ bí ẩn và cho thấy con đường phía trước :-)
Đã giải cứu từ các bình luận:
Đây là kỹ thuật tiêu chuẩn để phá vỡ sự tương đương kiểu chéo (ví dụ 0.0 == 0
, True == 1
và Decimal(8.5) == 8.5)
. Kỹ thuật này được sử dụng trong mô-đun biểu thức chính quy của Python 2.7 để buộc các biểu thức unicode phải được lưu vào bộ nhớ đệm khác biệt với các biểu thức str tương đương khác. Kỹ thuật này cũng được sử dụng trong Python 3 cho functools.lru_cache () khi tham số đã nhập là true.
Nếu OP cần một cái gì đó khác với quan hệ tương đương mặc định, thì một số quan hệ mới cần được xác định. Tùy thuộc vào trường hợp sử dụng, đó có thể là phân biệt chữ hoa chữ thường đối với chuỗi, chuẩn hóa cho unicode, giao diện trực quan (những thứ trông khác nhau được coi là khác nhau), danh tính (không có hai đối tượng riêng biệt nào được coi là bằng nhau), một cặp giá trị / loại hoặc một số khác hàm xác định một quan hệ tương đương. Với ví dụ cụ thể về OPs, có vẻ như anh ấy / cô ấy mong đợi sự phân biệt theo loại hoặc phân biệt trực quan.
Trong Python, False
và 0
được coi là tương đương, như là True
và 1
. Bởi vì True
và 1
được coi là cùng một giá trị, chỉ một trong số chúng có thể xuất hiện trong một tập hợp cùng một lúc. Cái nào phụ thuộc vào thứ tự mà chúng được thêm vào tập hợp. Ở dòng đầu tiên, set1
được sử dụng làm tập hợp đầu tiên, vì vậy chúng tôi nhận được 1
tập hợp kết quả. Trong tập hợp thứ hai, True
là trong tập hợp đầu tiên, do đó True
được bao gồm trong kết quả.
Nếu bạn xem https://docs.python.org/3/library/stdtypes.html#boolean-values phần 4.12.10. Giá trị Boolean:
Giá trị Boolean là hai đối tượng không đổi False và True . Chúng được sử dụng để biểu diễn các giá trị chân lý (mặc dù các giá trị khác cũng có thể được coi là sai hoặc đúng). Trong ngữ cảnh số (ví dụ khi được sử dụng làm đối số cho một toán tử số học), chúng hoạt động giống như các số nguyên 0 và 1 , tương ứng.