【问题标题】:Filtering out shorter sublists过滤掉较短的子列表
【发布时间】:2018-05-17 03:02:14
【问题描述】:

我有一个嵌套列表:

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

我需要一种算法来获取较短子列表的索引,其中所有元素都包含在较长的子列表中。在这个例子中算法应该返回:

[0, 1, 2]

任何帮助将不胜感激!

【问题讨论】:

  • 单个列表是否可以包含重复值?如果是这样,包含相同元素三次的列表是否被视为一个较长的“子列表”,它只包含该元素一次?您如何计算“更长” - 按元素数量或不同元素的数量? (另外 - 显然你不关心列表中元素的顺序;对吗?)

标签: python python-3.x algorithm list


【解决方案1】:

一种方法可能是在同一个列表中使用双 for 循环,并在不等于 index 时使用 .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)

结果:

[0, 1, 2]

【讨论】:

  • 太棒了! Happy Coding.
【解决方案2】:

您可以将每个子列表转换为一个集合,并使用有用的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]

【讨论】:

  • 我在你的样本上运行它并得到[0, 1, 2],你还记得and i != k吗?如果您忘记了这一点,集合将被视为自身的子集。
【解决方案3】:
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])]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 2018-01-16
    • 2023-03-16
    • 1970-01-01
    • 2015-12-23
    • 2017-08-15
    • 2021-07-22
    相关资源
    最近更新 更多