#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
в случае, если я сравниваю с пустым набором. (Я тоже не голосовал против)