如何获取元素被更长子列表完全包含的短子列表索引?
解决嵌套列表中找被更长子列表包含的短子列表索引问题
我来帮你搞定这个需求!咱们的目标是找出所有满足「自身所有元素都被某个更长的子列表完全包含」的子列表的索引,对吧?
思路拆解
核心逻辑其实很直接:
- 逐个检查每个子列表,判断是否存在另一个子列表,同时满足两个条件:
- 这个子列表的长度比当前子列表大(确保是“更长”的)
- 当前子列表的所有元素都能在那个更长的子列表里找到
- 如果满足,就把当前子列表的索引加入结果集合
Python代码实现
话不多说,直接上可运行的代码:
def find_contained_sublists_indices(nested_list): result = [] # 遍历每个子列表,记录索引和内容 for idx, sublist in enumerate(nested_list): sublist_len = len(sublist) # 标记当前子列表是否被某个更长的列表包含 is_contained = False # 遍历其他所有子列表进行检查 for other_sublist in nested_list: other_len = len(other_sublist) # 首先确保另一个列表更长,然后检查当前子列表的所有元素都在其中 if other_len > sublist_len and all(item in other_sublist for item in sublist): is_contained = True break # 找到一个符合条件的就不用继续找了 if is_contained: result.append(idx) return result # 测试你的示例输入 input_list = [['spam', 'eggs'], ['spam', 'eggs', '111'], ['spam', 'eggs', 'foo'], ['spam', 'eggs', '111', 'bar'], ['spam', 'eggs', 'foo', 'bar']] print(find_contained_sublists_indices(input_list)) # 输出: [0, 1, 2]
代码解释
- 用
enumerate遍历嵌套列表,同时获取子列表的索引和内容 - 对于每个子列表,我们遍历所有其他子列表,先判断长度是否更长,再用
all(item in other_sublist)检查所有元素是否都被包含 - 一旦找到符合条件的更长子列表,就标记当前子列表为“被包含”,并跳出内层循环
- 最后收集所有符合条件的索引返回
验证示例
针对你的输入:
- 索引0的
['spam', 'eggs']被索引1、2、3、4的子列表都包含,符合条件 - 索引1的
['spam', 'eggs', '111']被索引3的子列表包含,符合条件 - 索引2的
['spam', 'eggs', 'foo']被索引4的子列表包含,符合条件 - 索引3和4的子列表没有更长的列表能包含它们,所以不加入结果
最终输出正好是[0,1,2],完美符合你的预期!
内容的提问来源于stack exchange,提问作者Alex Nikitin




