如何筛选子列表列表

时间:2013-11-24 09:33:34

标签: python list

所以我有一个列表列表,我想删除不符合要求的子列表。

lst = [[57], [71], [87], [97], [99], [101], [103], [113], [114], [115], [128], [131], [137], [147], [156], [163], [186]]
spectrum = [0, 113, 128, 186, 241, 299, 314, 427]

我尝试过的代码和结果:

for sublist in lst:  
    if sum(sublist) not in spectrum:  
        sublist.pop()

>>> [[], [], [], [], [], [], [], [113], [], [], [128], [], [], [], [], [], [186]]  

子列表是否包含方括号?那么为什么当我弹出子列表时,括号仍然存在?我怎么解决这个问题?我也试过lst.pop(sublist),但它保留了一些不符合要求的子列表。

2 个答案:

答案 0 :(得分:5)

听起来你想要filter列表只留下通过某个条件的项目。有一个内置功能filter,结合lambda,我们得到:

lst = filter(lambda x: sum(x) in spectrum, lst)

这也可以写成列表理解(正如它在过滤器上的文档中所说的那样):

lst = [x for x in list if sum(x) in spectrum]

时间更快:

>>> import timeit
>>> timeit.Timer('filter(lambda x: sum(x) in spectrum, lst)', 'from __main__ import lst, spectrum').repeat()
[7.258743352344543, 7.146834532770029, 7.233350271593071]
>>> timeit.Timer('[x for x in lst if sum(x) in spectrum]', 'from __main__ import lst, spectrum').repeat()
[5.67072096449019, 5.8301157366216785, 5.674548399701351]

在这种情况下,list-comprehension更快,但通常情况下,使用filter内置的更复杂的过滤是首选。

答案 1 :(得分:2)

您的意思是从外部列表中删除子列表吗? sublist.pop(x)会从x删除sublist个元素,x默认为len(sublist) - 1

for sublist in lst:
    if sum(sublist) not in spectrum:
        lst.remove(sublist)

迭代时,不应修改

result_list = []
for sublist in lst:
    if sum(sublist) in spectrum:
        result_list.append(sublist)

这更简洁(而不是更少的pythonic)

lst = [sublist for sublist in lst if sum(sublist) in spectrum]