【问题标题】:Find the index of supersets for each sublist in another list查找另一个列表中每个子列表的超集索引
【发布时间】:2018-12-19 10:09:41
【问题描述】:

我试图在与另一个列表中的元素共享相同数据的元素列表中查找索引号。这些是我的清单:

list_A = [['A',1,'a',],['B',2,'b'],['C',3,'c'],['D',4,'d'],['E',5,'e'],['F',6,'f']]
list_B = [['A','a'],['D','d']['E','e']]

并且期望的输出应该是:

[0,3,4]

我尝试过使用 set()intersection 和 index 函数,但我无法让 'set' 与列表列表一起使用。

【问题讨论】:

  • 什么是不匹配的?
  • 您的“编辑”已使此处的每个答案都无效,因为没有表明子列表中存在可变类型。
  • 我知道 - 道歉。我应该删除它并作为新问题打开吗?
  • 不,这是对这里回答您问题的用户的不尊重。建议是在此处接受您认为最能解决 this 问题的答案之一,然后打开一个新问题以更好地列举您的要求。听起来不错? :-)
  • 是的 - 会这样做。 (抱歉,我是这个社区的新手,不熟悉它的规则。谢谢!

标签: python list indexing set


【解决方案1】:

如果您的列表值没有重复项,您可以将所有内容转换为集合并在列表推导中执行子集检查。

set_A = list(map(set, list_A))
set_B = list(map(set, list_B)) 
# set_B = map(set, list_B) # If you intend to use and throw. 

[next((i for i, a in enumerate(set_A) if a.issuperset(b)), None) for b in set_B]
# [0, 3, 4]

目前,如果没有匹配,next 返回您传递给它的默认值,在本例中为 None

【讨论】:

  • 非常好,因为它预先转换为设置,避免了额外的开销
  • @Jean-FrançoisFabre 也许你是说 set_B 的意思?仅迭代一次。但是,是的,你是对的。
【解决方案2】:

您可以执行以下操作:

list_A = [['A', 1, 'a', ], ['B', 2, 'b'], ['C', 3, 'c'], ['D', 4, 'd'], ['E', 5, 'e'], ['F', 6, 'f']]
list_B = [['A', 'a'], ['D', 'd'], ['E', 'e']]

set_B = list(map(set, list_B))
result = [i for i, e in enumerate(list_A) if any(b.intersection(e) for b in set_B)]

print(result)

输出

[0, 3, 4]

【讨论】:

  • 请注意,调用set.intersection 的效率低于调用set.issuperset/issubset,后者返回一个布尔值,而前者在内存中构建并返回一个集合。
猜你喜欢
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 2013-08-14
  • 2015-06-09
  • 1970-01-01
相关资源
最近更新 更多