2011-08-13 6 views

答えて

7

あなたはgenerator expressionall()を使用することができます。

>>> all(x in dct for x in ('foo', 'bar', 'qux')) 
False 
>>> all(x in dct for x in ('foo', 'bar', 'baz')) 
True 
>>> 

それはあなたになんと2つの文字が保存されます(ただし、あなたがチェックする長いリストを持っている場合は、より多くのあなたが保存されます)。パイソン< 2.7の場合

+1

便利なリンクが含まれています。 :) – davidchambers

+0

...それは@ unutbuの以前の答えを繰り返すが。 –

+0

@飛行羊:私が私の入力を開始したときに答えがなかった。私はunutbuを開始し、入力を終了したが、肯定的な例と否定的な例を作成し、いくつかのリンクされた参照を追加したと思います。 [すなわち私は彼の宿題をコピーしませんでした;-)] – Johnsyweb

8
all(x in dct for x in ('foo','bar','baz')) 
+0

非常に良い。ありがとう! – davidchambers

+0

+1セクシーです... – sholsapp

5
{"foo","bar","baz"}.issubset(dct.keys()) 

、あなたは、オペレータが好きで、別のセットを作成するパフォーマンスを気にしない場合は、上の<=演算子を使用することができますset(["foo","bar","baz"])

とリテラルセットを交換する必要がありますセットとdictのキーセット。

組み合わせ両方のバリエーションは次のようになります。

:あなたのpython 3を使用する場合

set(["foo","bar","baz"]) <= set(dct) 

最後に、dict.keys()は、あなたがこのようなパフォーマンスの低下なしでオペレーターを呼び出すことができることを意味しsetlikeオブジェクトを返します。

{"foo","bar","baz"} <= dct.keys() 
+0

これはきちんとした選択肢であり、TIMTOWTDIが避けられないIMHOを実証しています。残念ながら、2.6より小さい 'set'は' * args'を受けません - シーケンスを明示的に渡す必要があります(別の括弧のセット)。 –

+1

これはO(1)ではなくO(n)になります。たとえ辞書が非常に大きければ、これがいかに恐ろしいかを知るために、あなたはオランダ語である必要はありません。 – geoffspear

+0

setコンストラクタ呼び出しのエラーと、演算子に言及してくれてありがとう。私はO(n)がOPのケースで痛いとは思わない。なぜなら、彼は手動で各キーをチェックするからだ。:) –