Как вернуть False при использовании issubset и пустого набора

#python #optimization #set

#python #оптимизация #установить

Вопрос:

Когда у меня есть два набора, например

 s1 = set()    
s2 = set(['somestring'])
  

и я делаю

 print s1.issubset(s2)
  

он возвращает True ; так что, по-видимому, пустой набор всегда является подмножеством другого набора.

Для моего анализа он действительно должен вернуться False , и мне интересно, как это сделать наилучшим образом. Я могу написать такую функцию:

 def check_set(s1, s2):
    if s1 and s1.issubset(s2):
        return True
    return False
  

который затем действительно возвращается False для примера выше. Есть ли лучший способ сделать это?

Ответ №1:

Я бы сделал это так:

 s1 <= s2 if s1 else False
  

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

Комментарии:

1. Чем это лучше моего подхода, не могли бы вы подробнее остановиться на этом? Например, это быстрее?

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

3. Хорошо, спасибо (поддержано). Есть ли хорошая страница для < оператора? Я никогда не использую его для наборов.

4. На самом деле это <= то, что вы должны использовать. Документировано здесь . Вы должны использовать только s1.issubset(s2) в том случае, если s2 — это нечто иное, чем объект set, например, список.

5. Хорошо, на этой странице написано, что обе команды эквивалентны (если я правильно понимаю). Выполнит несколько тестов вовремя…

Ответ №2:

Вы можете воспользоваться тем, как Python оценивает достоверность объекта, а также тем, как он замыкает логические and выражения с помощью:

 bool(s1) and s1 <= s2
  

По сути, это означает: if s1 — это что-то не пустое, и это подмножество s2

Ответ №3:

Вместо использования an if вы можете заставить результат быть a bool , выполнив это:

 def check_set(s1, s2):
    return bool(s1 and s1.issubset(s2))
  

Комментарии:

1. Тогда это также должно работать без bool (и тогда это будет ответ, опубликованный @Mr.goosberry).

2. @Cleb это было бы, но я думаю, что я переоценил тот факт, что возвращаемые значения могут отличаться.

3. @Mr.goosberry: Да, я тоже это пропустил. (проголосовал за это сейчас)

Ответ №4:

Почему бы просто не вернуть значение? Таким образом, вам не нужно писать return True или return False .

 def check_set(s1, s2):
    return bool(s1 and s1.issubset(s2))
  

Комментарии:

1. Теперь вы не знаете тип возвращаемого значения, это будет либо set, либо bool . Это не идеально …

Ответ №5:

Вместо использования пустого набора вы можете использовать набор с пустым значением:

s1 = set(['']) или s1 = set([None])

Тогда ваше print утверждение будет работать так, как вы ожидали.

Комментарии:

1. Я не думаю, что он пытался исправить свою инструкцию print. Я полагаю, что он просил лучший способ вернуть false в своей check_set() функции. (И я не проголосовал против вашего ответа)

2. Может быть, @Cleb мог бы прояснить это? Хотя этот ответ меняет предположения, он может упростить общую проблему.

3. Я могу уточнить: @Mr.goosberry, совершенно прав; Я хотел бы получить простой и быстрый способ возврата False в случае, если я сравниваю с пустым набором. (Я тоже не голосовал против)