【问题标题】:Comparing strings in a list比较列表中的字符串
【发布时间】:2016-09-27 20:29:58
【问题描述】:

我正在尝试通过查找和排除具有相同“附属名称”的字典条目来过滤来自 API 的搜索结果。

长话短说,在下面的代码中,entry2 是一个包含 20 个字典的列表,所有字典都在其中嵌套了字典,其中一个是“附属关系”。在 entry2 的每个元素的嵌套字典“附属关系”中,我想比较“affilnames”,如果它们不相等,则将相关的 entry2 字典元素传递给新列表 entry3。

到目前为止,我有以下内容(因为所有 entry2 字典在 'affiliation' 中只有 2 个列表元素):

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

工作正常(并返回具有 9 个字典条目的 entry3)。但是,可能并不总是“附属”中只有 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']]

任何人都可以帮我解决这是怎么回事吗?

谢谢

【问题讨论】:

  • 可读性!!!只要您编写不可读的代码,您就会一直遇到问题......这一行值得分成至少三个单独的行。缓存foo=s['affiliation'],然后使用any(bar['affilname'] for bar in foo[1:-1])而不是range()等,这样就很容易发现错误。当然不要使用foobar 而是选择一些有意义的名字... :)

标签: python python-3.5


【解决方案1】:

list comprehensionfilter 条件结构不正确。 any 返回一个布尔值,您将其与 affilname 条目进行比较 - 一个字符串。这将返回所有条目,因为字符串永远不会等于布尔值。

您可以改为检查是否有任何带有 affilname 子字典的条目与该类别/子字典级别中的第一个 affilname 不匹配:

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

一旦在该 subdict 级别出现不匹配,任何 中断 并返回 True,这会将条目添加到 entry3

【讨论】:

  • @RThompson 我对索引进行了修复。请注意
猜你喜欢
  • 2023-04-06
  • 1970-01-01
  • 2021-10-29
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
  • 2020-03-05
  • 1970-01-01
相关资源
最近更新 更多