【问题标题】:Finding the same second elements in nested lists - recursive function在嵌套列表中查找相同的第二个元素 - 递归函数
【发布时间】:2016-10-05 23:59:57
【问题描述】:

我的嵌套列表看起来像这样;

[['CELTIC AMBASSASDOR', 'Warrenpoint'],['HAV SNAPPER', 'Silloth'],['BONAY', 'Antwerp'],['NINA', 'Antwerp'],['FRI SKIEN', 'Warrenpoint']]

然后继续。如何找到具有相同第二个元素的列表,例如

['CELTIC AMBASSASDOR', 'Warrenpoint']
['FRI SKIEN', 'Warrenpoint']

['BONAY', 'Antwerp']
['NINA', 'Antwerp']

列表太长(我是从 .csv 文件中读取的),我无法确定要准确搜索哪个内容(例如:我无法搜索“安特卫普”来查找所有安特卫普,因为我没有'不知道 csv 文件中的所有文本),所以我认为我需要一个递归函数来搜索直到找到由第二个项目分隔的所有嵌套列表。无法弄清楚如何制作递归函数,如果有人有更好的解决方案,非常感谢。

【问题讨论】:

  • 根据每个列表成员的第二个元素,这看起来像是 Collection 或 groupby 的作业。

标签: python list recursion python-3.4 nested-lists


【解决方案1】:

这里不需要使用递归。使用第二个元素的键和整个子列表的值创建一个字典,然后创建一个只包含您感兴趣的匹配项的结果:

import collections
l = [['CELTIC AMBASSASDOR', 'Warrenpoint'],['HAV SNAPPER', 'Silloth'],['BONAY', 'Antwerp'],['NINA', 'Antwerp'],['FRI SKIEN', 'Warrenpoint']]
d = collections.defaultdict(list)
for item in l:
    d[item[1]].append(item)

result = dict(item for item in d.items() if len(d[item[0]]) > 1)

结果:

>>> import pprint
>>> pprint.pprint(result)
{'Antwerp': [['BONAY', 'Antwerp'], ['NINA', 'Antwerp']],
 'Warrenpoint': [['CELTIC AMBASSASDOR', 'Warrenpoint'],
                 ['FRI SKIEN', 'Warrenpoint']]}

【讨论】:

  • 哇。我们的答案几乎完全相同。
  • @juanpa.arrivillaga - 奇怪的是怎么会这样。 :P 我认为你的包含一个误报条目Silloth': [['HAV SNAPPER', 'Silloth']],不过。
  • 当然,我没有费心过滤。你的更完整。我鞠躬
  • 您好,谢谢您的回答,l 是否代表具有嵌套列表的大列表?如果是,listd = collections.defaultdict(list) 中代表什么?
  • 这是一种特殊的字典,如果找不到某个键,它会调用传递的参数(在本例中为list)来创建一个具有所需键和默认值的条目。请参阅collections.defaultdict 的文档。
【解决方案2】:
filter(lambda x:x[1] in set(filter(lambda x:zip(*l)[1].count(x)==2,zip(*l)[1])),l)

【讨论】:

  • 虽然这可能会回答这个问题,但如果您添加解释为什么这样做会更有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 2018-08-21
相关资源
最近更新 更多