所以我有一个列表列表,我想删除不符合要求的子列表。
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)
,但它保留了一些不符合要求的子列表。
答案 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]