Я хотел бы знать, почему это действительно:
set(range(10)) - set(range(5))
но это неверно:
set(range(10)) + set(range(5))
Это потому, что '+' может означать как пересечение, так и объединение?
Я хотел бы знать, почему это действительно:
set(range(10)) - set(range(5))
но это неверно:
set(range(10)) + set(range(5))
Это потому, что '+' может означать как пересечение, так и объединение?
Наборы Python не имеют реализации для оператора +
.
Вы можете использовать |
для set union и &
для заданного пересечения.
Наборы реализуют -
как заданную разницу. Вы также можете использовать ^
для симметричной разности наборов (т.е. Он вернет новый набор только с объектами, которые появляются в одном наборе, но не отображаются в обоих наборах).
Python решил использовать |
вместо +
, потому что set union - это понятие, которое тесно связано с логической дизъюнкцией; Бит-векторы (которые в python просто int
/long
) определяют эту операцию по последовательности логических значений и называют ее "побитовым" или "бит". Фактически эта операция настолько похожа на объединение множества, что двоичные целые числа иногда также называются "битовыми наборами", где элементами в множестве считаются натуральные числа.
Так как int
уже определяет set-подобные операторы как |
, &
и ^
, для более нового типа set
было бы естественно использовать тот же интерфейс.
Конечно, они могли бы использовать +
для объединения, но тогда все равно понадобится символ для пересечения. |
для объединения симметрично с &
для пересечения и, следовательно, делает лучший выбор.
В теории множеств символ + обычно обозначает несвязное объединение двух множеств. Если A и B - множества, то их несвязное объединение определяется как множество
A + B = {(a, 1) | a in A} U {(b, 2) | b in B}
т.е. для построения несвязного объединения мы отмечаем все элементы A и все элементы B с разными тегами (в примере я использовал числа 1 и 2, но любые две разные вещи могли бы выполнять эту работу) и то возьмем объединение двух результирующих множеств. В приведенном выше примере я использовал 'U' для set union, чтобы сделать его более похожим на обычную математическую нотацию; ниже я использую нотацию Python, т.е. '|' для объединения, и '&' для пересечения.
Если A и B не пересекаются, то A + B имеет 1-к-1 соответствие с A | B. Если это не так, то все общие элементы x в и B дважды появляются в + B: один раз (x, 1) и один раз (x, 2).
Итак, поскольку символ "+" имеет довольно устоявшееся значение в качестве заданной операции, я считаю очень последовательным, что Python не использует этот символ для объединения или пересечения. Вероятно, дизайнеры Python имели это в виду, когда они выбирали операторы набора.
Потому что |
означает объединение и &
означает пересечение. Очевидно, нет причин добавлять несколько операторов для одной и той же функции.
Причины использования |
и &
, вероятно, возвращаются к побитовым операциям. Если вы представляете набор как биты в числе, это операторы, которые вы должны использовать для объединения и пересечения.
+
simple не привязан к соединению, а -
- установить разницу.
Потому что установить разницу - очень полезная и общеизвестная концепция, но нет (универсально используемой) концепции "сложения добавления".