2016-10-03 4 views
3

私は2つのセットがあるとします。issubsetと空のセットを使用するとFalseを返す方法

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

と私はそれがTrueを返し

print s1.issubset(s2) 

を行います。つまり、空のセットは常に別のセットのサブセットです。

私の分析では、実際にはFalseを返さなければならず、私はこれを行うための最良の方法について疑問を抱いています。その後、実際に上記の例のためFalseを返し

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

:私はこのような関数を書くことができます。これを行うためのより良い方法はありますか?

答えて

2

あなたは、Pythonはオブジェクトそれに加えて短絡がでand式をブールどのようのtruthinessを評価する方法を利用することができます。

bool(s1) and s1 <= s2 

基本的にこれは意味:s1が空ではない何かであり、それはだ場合サブセットのs2

+0

もうまく動作(upvoted)。 – Cleb

4

私はこのようなことを行うだろう:それはビルトインではなく、より高価な関数呼び出しと属性検索を使用するよりもセットでサポートされている演算子を使用しているため

s1 <= s2 if s1 else False 

それは、より高速にする必要があります。それは論理的に同等です。

+0

これは私のアプローチよりも優れていますが、これについて詳しく説明できますか?例えば。それは速いですか? – Cleb

+0

関数呼び出しと属性参照を使用するのではなく、サポートを設定する組み込み演算子を使用するため、処理が高速になります。それは論理的に同等です。 – wim

+0

ありがとう(upvoted)。 '<'演算子の良いページはありますか?私はセットのためにそれを使用しません。 – Cleb

2

代わりのifを使用して、あなたはこれを行うことにより、boolする結果を強制することができます

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

それはまた、 'bool'なしで動作するはずです(そして@ Mr.goosberryが投稿した答えになります)。 – Cleb

+0

@Clebそれはありますが、戻り値が異なる可能性があることを私は見過ごしてしまったと思います。 –

+0

@ Mr.goosberry:はい、私はそれも逃しました。(upvoted)[OK]を、それが合理的に聞こえる – Cleb

1

理由だけではなく、値を返しませんか?そうすれば、return Trueまたはreturn Falseと書く必要がなくなります。

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

(今それをupvoted :)) – Cleb

+1

今、あなたは、戻り値の型を知らない、それはセットまたはブール値のどちらかになります。それは理想的ではありません... – wim

+0

@wim hmm。あなたの右。それを見てみましょう。 –

-1

代わりの空のセットを使用して、あなたは空の値にセットを使用することができます。そして、あなたのprint文はあなたが期待どおりに動作します

s1 = set([''])またはs1 = set([None])

+2

downvoterはdownvoteを説明できますか? – Cleb

+0

私は彼が彼のプリントステートメントを修正しようとしていたとは思わない。私は彼が 'check_set()'関数でfalseを返す良い方法を求めていたと思う。 (そして私はあなたの答えを落としていませんでした) –

+0

@Clebがこれを明確にするかもしれませんか?この回答は前提条件を変更しますが、全体的な問題を単純化する可能性があります。 –

関連する問題