Python 筛选出较短的子列表

Python 筛选出较短的子列表,python,python-3.x,algorithm,list,Python,Python 3.x,Algorithm,List,我有一个嵌套列表: [['spam', 'eggs'], ['spam', 'eggs', '111'], ['spam', 'eggs', 'foo'], ['spam', 'eggs', '111', 'bar'], ['spam', 'eggs', 'foo', 'bar']] 我需要的是一个算法来获取较短子列表的索引,这些子列表的所有元素都包含在较长的子列表中。在此示例中,算法应返回: [0, 1, 2] [0, 1, 2] 任何帮助都将不胜感激 您可以将每个子列表转换为一个集合,

我有一个嵌套列表:

[['spam', 'eggs'],
['spam', 'eggs', '111'],
['spam', 'eggs', 'foo'],
['spam', 'eggs', '111', 'bar'],
['spam', 'eggs', 'foo', 'bar']]
我需要的是一个算法来获取较短子列表的索引,这些子列表的所有元素都包含在较长的子列表中。在此示例中,算法应返回:

[0, 1, 2]
[0, 1, 2]

任何帮助都将不胜感激

您可以将每个子列表转换为一个集合,并使用有用的方法。如果列表中有需要保留的重复元素,则此操作将不起作用

x = [set(i) for i in x]

x = [i
 for i, e in enumerate(x)
 if any(e.issubset(j) and i != k
        for k, j in enumerate(x))
 ]

# [0, 1, 2]

一种方法是对同一列表中的循环使用double
,当索引不相等时,使用
.issubset

my_list = [['spam', 'eggs'],
            ['spam', 'eggs', '111'],
            ['spam', 'eggs', 'foo'],
            ['spam', 'eggs', '111', 'bar'],
            ['spam', 'eggs', 'foo', 'bar']]

indexes = []
for index1, item1 in enumerate(my_list):
    for index2, item2 in enumerate(my_list):
        if index1 != index2:
            if set(item1).issubset(item2):
                indexes.append(index1)
                break

print(indexes)
结果:

out_index=[i代表范围内的i(len(我的_列表))
如果有(设置(我的列表[i])
我在你的样本上运行它,得到
[0,1,2]
,你还记得
和我吗!=k
?如果你忘记了这一点,集合将被视为自身的子集。太棒了<代码>快乐编码
。单个列表是否可以包含重复的值?如果是这样的话,一个包含相同元素三次的列表是否被视为一个较长元素的“子列表”,而该元素只包含一次?那么,如何计算“更长的时间”——按元素的数量,还是按不同元素的数量?(还有——显然,您并不关心列表中元素的顺序,对吗?)
out_index = [i for i in range(len(my_list)) 
             if any(set(my_list[i]) < m 
             for m in [set(j) for j in my_list])]