2016-09-27 11 views
1

私は、「所属名」がすべて同じ辞書エントリを見つけて除外しようとすると、APIの検索結果を除外しようとしています。リスト内の文字列を比較する

短いストーリーを省略すると、下のコードでは、entry2は、すべてが辞書内のネストされた20の辞書の1つです。そのうちの1つは「所属」です。 entry2の各要素に対するこのネストされた辞書の「所属」の中で、私は 'affilnames'を比較し、それらがすべて等しいとは限らない場合、問題のentry2辞書要素を新しいリストentry3に渡す。

(すべてENTRY2辞書のみを「所属」内2つのリストの要素を持っているので)これまでのところ、私は次のようしている:

entry3 = [s for s in entry2 if s['affiliation'][0]['affilname'] != s['affiliation'][1]['affilname']] 

正常に動作します(とリターンが9つの辞書のエントリを持つentry3)。しかし、「所属」内に2つのリストエントリしか存在しない場合もありますので、「所属」内のすべての文字列を比較する方法を探したいと思います。私は、論理的に私には理にかなって、次のコード行を持っていますが、ENTRY2として辞書の要素の数が同じものとしてentry3を返して:

entry3 = [s for s in entry2 if any(s['affiliation'][i]['affilname'] for i in range(1,len(s['affiliation'])-1)) != s['affiliation'][0]['affilname']] 

は、誰もが何が起こっているかで私を助けることができるの?あなたのリスト内包

おかげ

+0

可読性!!!あなたが読めないコードを書いている限り、あなたは問題を抱えています...この行は少なくとも3つの別々の行に分割する価値があります。 '' foo = s ['affiliation'] 'をキャッシュし、' range() 'の代わりに' 'any(bar ['affilname']' 'foo [1:-1]' 'bar'')を使用します。スポットに。もちろん、 'foo'と' bar'を使わずに意味のある名前を選んでください:) –

答えて

2

フィルタ条件が適切に構造化されていません。 anyは、文字列のaffilnameと比較しているブール値を返します。これは、文字列がブール値に決して等しくないので、すべてのエントリを返します。

そのカテゴリ/ subdictレベルでの最初のaffilnameに一致していないaffilname subdictを持つエントリがある場合は、代わりにチェックすることができます。

entry3 = [s for s in entry2 if any(dct['affilname'] != s['affiliation'][0]['affilname'] for dct in s['affiliation'])] 

そのsubdictレベルでの不整合があるならば、 は、を返し、Trueを返します。これは、そのエントリをentry3に追加します。

+0

@RThompsonインデックス作成を修正しました。 Plsはメモを取る –