过滤掉较短的子列表

时间:2018-05-17 03:02:15

标签: 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]

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

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

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]

答案 1 :(得分:1)

一种方法可能是在同一个列表中使用双for循环,并在不.issubset时与index一起检查:

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)

结果:

[0, 1, 2]

答案 2 :(得分:1)

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])]