Я хотел бы знать, почему это действительно так:
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 не так привязан к объединению, а -устанавливает разницу.
Потому что разница наборов - очень полезная и широко известная концепция, но нет (универсально используемой) концепции «сложения наборов».
+определяется как пополнение . Некоторые используют его для симметричной разницы . В любом случае, любая бумага, в которой он используется, либо называет это как-то иначе, либо сначала определяет это.
|означает союз. Что ты спрашиваешь?