从列表中删除嵌套(两个元素的列表)的简单方法?

2024-04-26 18:15:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个input_list = [[1,2],[1,3],[1,4],[2,8],[2,10]]

然后我有一个elimination_list = [[1,2],[2,8]]

然后,我创建一个result_list,其中包含输入列表的元组,但排除列表中的元组除外

因此result_list = [[1,3],[1,4],[2,10]]

我可以用下面这样的多个for循环来实现这一点,但是有没有办法用更少的代码行来实现呢

for x,y in input_list:
    is_eliminate = 0
    for a,b in elimination_list:
        if x == a and y == b:
            is_eliminate = 1

    if is_eliminate == 0:
        result_list.append([x,y])

Tags: and代码in列表forinputifis
3条回答

您可以使用包含测试(in)和列表理解:

result_list = [t for t in input_list if t not in elimination_list]

t not in elimination_list阴性包含测试将在所有elimination_list上循环,以查看元素是否存在

如果可以将列表转换为实际的元组,则可以使用设置成员资格测试的更快选项:

input_list = [(1, 2), (1, 3), (1, 4), (2, 8), (2, 10)]
elimination_set = {(1, 2), (2, 8)}
result_list = [t for t in input_list if t not in elimination_set]

这里eliminitaion_set是一个包含元组(不可变序列)的集合,t not in elimination_set使用散列算法来确定任何给定的元组在平均O(1)(常数)时间内是否是成员

不过,您没有input_list转换为元组的;仅在测试时,您可以进行转换:

input_list = [[1, 2], [1, 3], [1, 4], [2, 8], [2, 10]]
elimination_set = {(1, 2), (2, 8)}
result_list = [t for t in input_list if tuple(t) not in elimination_set]

您可以在条件下使用列表理解:

result_list = [t for t in input_list if t not in elimination_list]

对于较大的列表,您可以使用set更快地消除:

elimination_set = set((tuple(x) for x in elimination_list))
result_list = [t for t in input_list if tuple(t) not in elimination_set]

功能风格相同的两种解决方案:

result_list = filter(lambda t: t not in elimination_list, input_list)

或:

elimination_set = set(map(lambda x: tuple(x), elimination_list))
result_list = filter(lambda t: t not in elimination_set, input_list)

只需使用filterin

result = filter(lambda x: x not in elimination_list, input_list)

相关问题 更多 >