2016-09-27 80 views
1

我試圖通過嘗試查找和排除具有「聯屬名稱」的詞典條目來篩選API中的搜索結果,這些條目都是相同的。比較列表中的字符串

爲了簡短起見,在下面的代碼中,entry2是一個包含20個字典的列表,其中包含嵌套字典,其中一個是「隸屬關係」。在entry2的每個元素的這個嵌套詞典的「隸屬關係」中,我想比較'affilnames',如果它們不是全部相等,則將有問題的entry2詞典元素傳遞給新列表entry3。

到目前爲止,我有以下的(因爲所有ENTRY2字典只有在「歸屬」 2個列表元素):

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

的正常工作(並返回entry3有9個詞典條目)。但是,並不總是這種情況,在「聯屬」中只有2個列表條目,所以我想找到一種方法來比較「聯屬」中的所有字符串。我有下面的代碼行這在邏輯上是有道理的我,但正在恢復entry3具有相同數量的字典元素ENTRY2的:

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

可讀性!只要你編寫不可讀的代碼,你就會一直有問題......這條線至少應該分成三個獨立的行。緩存'foo = s ['affiliation']',然後在foo [1:-1])中用'any(bar ['affilname']']代替'range()'等等,然後這個錯誤會很容易現貨。當然,不要使用'foo'和'bar',但選擇一些有意義的名字...... :) –

回答

2

過濾條件的列表理解的不正常結構。 any返回一個布爾值,您將與affilname條目進行比較 - 一個字符串。這將返回所有條目,因爲字符串永遠不會等於布爾值。

可以代替檢查是否有與affilname subdict不是任何條目匹配該類別/ subdict級別的第affilname

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

一旦有那個subdict水平不匹配,任何中斷並返回True,這將添加該條目entry3

+0

@RThompson我對索引做了一個修復。請注意 –