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