Союз 2 наборів містить не всі предмети


94

Як це, коли я зміню порядок двох наборів у профспілках нижче, я отримую різні результати?

set1 = {1, 2, 3}
set2 = {True, False}

print(set1 | set2)
# {False, 1, 2, 3}

print(set2 | set1)
#{False, True, 2, 3}

Відповіді:


110

Чому union () містить не всі елементи

1І Trueеквівалентні і вважаються дублікатами. Аналогічним чином, 0а Falseтакож еквівалентні:

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

Яке еквівалентне значення використовується

Коли зустрічаються кілька еквівалентних значень, набори зберігають перше побачене:

>>> {0, False}
{0}
>>> {False, 0}
{False}

Способи зробити цінності різними

Щоб з ними поводились як з різними, просто збережіть їх у (value, type)парі:

>>> 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()

Інший спосіб розрізнити значення - це зберігати їх як рядки:

>>> set1 = {'1', '2', '3'}
>>> set2 = {'True', 'False'}
>>> set1 | set2
{'2', '3', 'False', 'True', '1'}
>>> set1 & set2
set()

Сподіваюся, це прояснить таємницю і покаже шлях вперед :-)


Рятували з коментарів:

Це стандартна техніка розриву еквівалентності перехресного типу (тобто 0.0 == 0, True == 1і Decimal(8.5) == 8.5). Ця техніка використовується в модулі регулярних виразів Python 2.7, щоб змусити регулярні вирази Unicode кешуватися чітко, ніж інакше еквівалентні регулярні вирази str. Цей метод також використовується в Python 3 для functools.lru_cache (), коли введений параметр має значення true.

Якщо ОП потребує чогось іншого, окрім відношення еквівалентності за замовчуванням, тоді потрібно визначити якесь нове відношення. Залежно від варіанту використання, це може бути нечутливість до рядків, нормалізація для юнікоду, візуальний вигляд (речі, які виглядають по-різному, вважаються різними), ідентичність (жоден два окремі об'єкти не вважаються рівними), пара значення / тип або деякі інші функція, що визначає відношення еквівалентності. З огляду на конкретний приклад ОП, здається, він / вона очікував або відмінності за типом, або візуальної різниці.


20

У Python Falseі 0вважаються рівнозначними, як Trueі 1. Оскільки Trueі 1вважаються однаковими значеннями, лише один із них може бути присутнім у наборі одночасно. Який з них залежить від порядку їх додавання до набору. У першому рядку set1використовується як перший набір, тому ми потрапляємо 1в отриманий набір. У другому наборі Trueзнаходиться в першому наборі, тому Trueвключається в результат.


6

Якщо ви подивитесь на https://docs.python.org/3/library/stdtypes.html#boolean-values розділ 4.12.10. Булеві значення:

Логічні значення - це два постійні об'єкти False і True . Вони використовуються для представлення істинних цінностей (хоча інші цінності також можна вважати помилковими або істинними). У числовому контексті (наприклад, коли використовується як аргумент арифметичного оператора), вони поводяться як цілі числа 0 та 1 відповідно.


4

Оператор порівняння ( ==, !=) визначений для логічного значення Trueта Falseзбігу 1 і 0.

Ось чому, в союзі множин, коли він перевіряє, чи Trueвже в новому наборі, він отримує правдиву відповідь:

>>> True in {1}
True
>>> 1 in {True}
True
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.