2016-09-27 58 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我对索引做了一个修复。请注意 –