2017-02-05 11 views
0

リスト内包表記の中に辞表があるかどうかを確認するにはどうすればよいですか?リスト内包表記の中に辞書があるかどうかチェックする

私はこのようにしようとしている:Falseを返す

print dict in [company["attribute"] for company in dictionary["companies"]] 

、それがtrueを返すとき。

ありがとうございました。

+0

特定の辞書があるかどうか、またはリストに辞書が含まれているかどうかを確認しますか? –

+1

リストの作成方法はどういう意味ですか? –

+0

辞書がある場合@MosesKoledoye –

答えて

2

print any(map(lambda x: isinstance(x, dict), [company... ]))が有効です。

+0

このコードの機能について教えてください。 –

+0

'[company ...]'は、あなたが使っているリスト理解のためのショートカットです。 'lambda x:isinstance(x、dict)'は、引数が 'dict'オブジェクトの場合は' True'を返し、それ以外の場合は 'False'を返します。 'map(lambda ...、[company ...])'は '[company ...]'リストを 'lambda ...を呼び出した結果のリストに変換します。'関数はその要素に作用するので、最初の要素として' dict'が続き、その後に2つの非dictsが続くリストの場合は、[True、False、False、...]のようになります。 'iterable'の要素が真実であれば' any(iterable) 'は' True'を返します。 – mkorvas

4

dictclassですので、listに辞書を作成するこのクラスは尋ねていますか?あなたが本当に知りたいのは、dictによって作成されたインスタンスがlistにあるかどうかです。あなたはisinstanceを使って比較することができます。

ディクショナリがリスト内包であるかどうかをチェックしても、実際にはあなたのコードでlist(リスト内包を使用)が作成されていて、listにあるかどうかを確認しました。あなたは後でリストを捨てます。これは、マッチするまで最初のいくつかの項目をチェックしたいだけであっても、リスト全体を構築すると非効率です。

あなたはisinstanceanyを使用することができます。

g = (isinstance(company["attribute"], dict) 
    for company in dictionary["companies"]) 

gは、実際にはまだそれほどのいずれも評価されていない。

print any(isinstance(company["attribute"], dict) 
      for company in dictionary["companies"]) 

私のコードは、理解を一般化したものであるジェネレータ式を使用しています属性がdictのインスタンスかどうかを確認するために属性がチェックされています。ジェネレータが消費され、またはマテリアライズされたときにのみ、結果が評価され、生成されます。発電機として

gは、値の配列をとる任意の関数に渡すことができる。

print any(g) 

any関数値生成収率を反復します。 anyは、Trueと評価され、最初の値で停止する値を探しています。これは、ジェネレータが必要な回数だけ評価され、逐次検索する効率的な方法であることを意味します。

同様に、nextをジェネレータとともに使用して、いくつかの基準に一致する次の値を見つけることができます。実際の辞書を使いたい場合は、次のように言うことができます:

attribute = next(company["attribute"] 
       for company in dictionary["companies"] 
       if isinstance(company["attribute"], dict)) 
+1

この回答は、「** isinstance' **(および 'any')を使用することができます。 – mkrieger1

関連する問題