Liên hiệp 2 bộ không chứa tất cả các mặt hàng


94

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:


110

Tại sao union () không chứa tất cả các mục

Các 1Truetương đương và được coi là bản sao. Tương tự như vậy 0Falsecũng tương đương:

>>> 1 == True
True
>>> 0 == False
True

Giá trị tương đương nào được sử dụng

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}

Các cách để làm cho các giá trị trở nên khác biệt

Để 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 == 1Decimal(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.


20

Trong Python, False0được coi là tương đương, như là True1. Bởi vì True1đượ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 1tập hợp kết quả. Trong tập hợp thứ hai, Truelà trong tập hợp đầu tiên, do đó Trueđược bao gồm trong kết quả.


6

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.


4

Toán tử so sánh ( ==, !=) được định nghĩa cho boolean TrueFalsekhớp với 1 và 0.

Đó là lý do tại sao, trong liên hiệp tập hợp, khi nó kiểm tra xem đã Truecó trong tập hợp mới chưa, nó sẽ nhận được câu trả lời trung thực:

>>> True in {1}
True
>>> 1 in {True}
True
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.