Подтвердить что ты не робот

Почему "+" не понятны наборам Python?

Я хотел бы знать, почему это действительно:

set(range(10)) - set(range(5))

но это неверно:

set(range(10)) + set(range(5))

Это потому, что '+' может означать как пересечение, так и объединение?

4b9b3361

Ответ 1

Наборы Python не имеют реализации для оператора +.

Вы можете использовать | для set union и & для заданного пересечения.

Наборы реализуют - как заданную разницу. Вы также можете использовать ^ для симметричной разности наборов (т.е. Он вернет новый набор только с объектами, которые появляются в одном наборе, но не отображаются в обоих наборах).

Ответ 2

Python решил использовать | вместо +, потому что set union - это понятие, которое тесно связано с логической дизъюнкцией; Бит-векторы (которые в python просто int/long) определяют эту операцию по последовательности логических значений и называют ее "побитовым" или "бит". Фактически эта операция настолько похожа на объединение множества, что двоичные целые числа иногда также называются "битовыми наборами", где элементами в множестве считаются натуральные числа.

Так как int уже определяет set-подобные операторы как |, & и ^, для более нового типа set было бы естественно использовать тот же интерфейс.

Ответ 3

Конечно, они могли бы использовать + для объединения, но тогда все равно понадобится символ для пересечения. | для объединения симметрично с & для пересечения и, следовательно, делает лучший выбор.

Ответ 4

В теории множеств символ + обычно обозначает несвязное объединение двух множеств. Если 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 имели это в виду, когда они выбирали операторы набора.

Ответ 5

Потому что | означает объединение и & означает пересечение. Очевидно, нет причин добавлять несколько операторов для одной и той же функции.

Причины использования | и &, вероятно, возвращаются к побитовым операциям. Если вы представляете набор как биты в числе, это операторы, которые вы должны использовать для объединения и пересечения.

+ simple не привязан к соединению, а - - установить разницу.

Ответ 6

Потому что установить разницу - очень полезная и общеизвестная концепция, но нет (универсально используемой) концепции "сложения добавления".