Як це, коли я зміню порядок двох наборів у профспілках нижче, я отримую різні результати?
set1 = {1, 2, 3}
set2 = {True, False}
print(set1 | set2)
# {False, 1, 2, 3}
print(set2 | set1)
#{False, True, 2, 3}
Як це, коли я зміню порядок двох наборів у профспілках нижче, я отримую різні результати?
set1 = {1, 2, 3}
set2 = {True, False}
print(set1 | set2)
# {False, 1, 2, 3}
print(set2 | set1)
#{False, True, 2, 3}
Відповіді:
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.
Якщо ОП потребує чогось іншого, окрім відношення еквівалентності за замовчуванням, тоді потрібно визначити якесь нове відношення. Залежно від варіанту використання, це може бути нечутливість до рядків, нормалізація для юнікоду, візуальний вигляд (речі, які виглядають по-різному, вважаються різними), ідентичність (жоден два окремі об'єкти не вважаються рівними), пара значення / тип або деякі інші функція, що визначає відношення еквівалентності. З огляду на конкретний приклад ОП, здається, він / вона очікував або відмінності за типом, або візуальної різниці.
У Python False
і 0
вважаються рівнозначними, як True
і 1
. Оскільки True
і 1
вважаються однаковими значеннями, лише один із них може бути присутнім у наборі одночасно. Який з них залежить від порядку їх додавання до набору. У першому рядку set1
використовується як перший набір, тому ми потрапляємо 1
в отриманий набір. У другому наборі True
знаходиться в першому наборі, тому True
включається в результат.
Якщо ви подивитесь на https://docs.python.org/3/library/stdtypes.html#boolean-values розділ 4.12.10. Булеві значення:
Логічні значення - це два постійні об'єкти False і True . Вони використовуються для представлення істинних цінностей (хоча інші цінності також можна вважати помилковими або істинними). У числовому контексті (наприклад, коли використовується як аргумент арифметичного оператора), вони поводяться як цілі числа 0 та 1 відповідно.