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
был в наборе, правда, если бы не