Python эквивалент Java-Set.add()?

В Java Set.add функция вернет логическое значение, которое true если набор еще не содержит указанный элемент.

Питона Set.add не имеет возвращаемого значения.

Похоже, в Python, если я хочу сделать то же самое, я должен сначала проверить, есть ли он в наборе, а затем добавить его, если нет.

Есть ли более простой способ сделать это (желательно однострочное)?

Ref:
https://docs.oracle.com/javase/7/docs/api/java/util/Set.html https://docs.python.org/2/library/sets.html

4 ответа

Решение

Если вы хотите однострочник, вы можете использовать or в add элемент, только если он еще не in набор (оценка короткого замыкания) и not инвертировать возвращаемое значение и в то же время привести к boolповорачивая None вернулся addесли это называется, в Trueи в противном случае просто инвертируя результат in проверять:

>>> s = set()
>>> not(42 in s or s.add(42))
True
>>> not(42 in s or s.add(42))
False
>>> s
set([42])

Однако, поскольку этот однострочный текст может быть не очень легко понять, и вам нужно записать значение, которое будет вставлено дважды, вы, вероятно, должны сделать его функцией, и тогда не имеет значения, сколько строк он использует.

def in_or_add(s, x):
    return not(x in s or s.add(x))

Нет, реализация набора Python не имеет такого метода; как вы заметили, вам придется проверять наличие отдельно:

if obj not in setobj:
    setobj.add(obj)

или, что я обычно делаю:

if obj in setobj:
    return  # or break out of a loop, etc.

# handle the case where the set doesn't have the object yet.

Вы всегда можете подкласс set тип:

class SetWithPresenceCheck(set):
    def add(self, value):
        not_present = value not in self
        super(SetWithPresenceCheck, self).add(value)
        return not_present

Обратите внимание, что настоящая причина Set.add() возвращает логическое значение для добавления и тестирования атомарной операции; Реализации интерфейса могут (опционально) синхронизировать метод и позволить вызывающим сторонам избегать условий гонки. Встроенный набор Python в любом случае не дает никаких обещаний безопасности потоков.

Оператор объединения намного быстрее, чем добавить.

>>> set_a = set('pqrs')
>>> set_b = ['t', 'u', 'v']
>>> set_a |= set(set_b)
>>> set_a
set(['p','q','r','s','t','u','v'])

Может быть с троичным условным оператором:

the_set.add(what_ever) or True if what_ever not in the_set else False

Это вернет Ложь, если what_ever был в наборе, правда, если бы не

Другие вопросы по тегам