Объединение 2 наборов не содержит всех элементов
почему, когда я изменить порядок двух наборов в союзах ниже, я получаю разные результаты?
set1 = {1, 2, 3}
set2 = {True, False}
print(set1 | set2)
# {False, 1, 2, 3}
print(set2 | set1)
#{False, True, 2, 3}
4 ответа:
почему union () не содержит все элементы
The
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 для функций.lru_cache (), если типизированный параметр имеет значение true.если OP нужно что-то другое, чем отношение эквивалентности по умолчанию, то необходимо определить какое-то новое отношение. В зависимости от варианта использования это может быть нечувствительность к регистру для строк, нормализация для unicode, внешний вид (вещи, которые выглядят по-разному, считаются разными), идентичность (нет двух разных объектов считается равным), пара значение/тип или какая-либо другая функция, определяющая отношение эквивалентности. Учитывая конкретный пример OPs, казалось бы, он/она ожидал либо различия по типу, либо визуального различия.
В Python,
False
и0
считаются эквивалентными, как иTrue
и1
. Потому чтоTrue
и1
считаются одинаковыми значениями, только одно из них может присутствовать в наборе a в одно и то же время. Какой из них зависит от того, в каком порядке они добавляются в набор. В первой строкеset1
используется в качестве первого набора, поэтому мы получаем1
в результирующем наборе. Во втором сетеTrue
находится в первом наборе, так чтоTrue
включается в результат.
Если вы посмотрите на https://docs.python.org/3/library/stdtypes.html#boolean-values раздел 4.12.10. Логические Значения:
логические значения - это два постоянных объекта false и True. Они используются для представления истинностных значений (хотя другие значения также могут считаться ложными или истинными). В числовых контекстах (например, при использовании в качестве аргумента для арифметического оператора) они ведут себя как целые числа 0 и 1, соответственно.