从列表列表python中删除所有特定值

时间:2014-03-07 15:45:57

标签: python

据我所知,这个问题(令人惊讶的是?)以前没有被问过 - 除非我因为缺乏经验而没有发现同样的问题。 (类似的问题有 被问及1D清单)

我有一个list_A,其中包含int值。 我想从list_of_lists中删除List_A中指定的所有值的所有出现。作为一个新手编码器,我可以在这里使用列表推导和循环来共同破解一些东西,但鉴于我已经读到了从列表中删除元素的低效率,我正在寻找更有经验的用户关于最快速的方法的建议。

list_of_lists= [
[1,2,3,4,5,6,8,9],
[0,2,4,5,6,7],
[0,1,6],
[0,4,9],
[0,1,3,5],
[0,1,4],
[0,1,2],
[1,8],
[0,7],
[0,3]
]

更多信息

  • 我不打算消除重复(这里已经存在一个问题)。我希望消除所有出现的选定值。
  • list_A通常可以包含200个值
  • list_of_lists将具有与上面所示类似的(长尾)分布,但按10,000行到10,000列的顺序
  • 输出可以是原始list_of_lists的修改版本或全新列表 - 以较快者为准

最后但并非最不重要(感谢RemcoGerlich提请注意这一点) - 我需要从列表列表中删除空的子列表

非常感谢

2 个答案:

答案 0 :(得分:1)

使用列表理解应该如下:

new_list = [[i for i in l if i not in list_A] for l in list_of_list]

之后,如果要删除空列表,可以进行:

for i in new_list:
    if not i:
        new_list.remove(i)
正如@ferhatelmas在评论中指出的那样:

new_list = [i for i in new_list if i]

为避免list_A中的重复,您可以使用list_A = set(list_A)

将其转换为一组

答案 1 :(得分:0)

我编写了一个只需要一个列表(或可迭代)和一个集合的函数,并返回一个新列表,其中删除了集合中的值:

def list_without_values(L, values):
    return [l for l in L if l not in values]

然后我将list_A转换为快速检查集,并循环遍历原始列表:

set_A = set(list_A)
list_of_lists = [list_without_values(L, set_A) for L in list_of_lists]

应该足够快,可读性是最重要的。