所以我有一个列表列表,我想删除不符合要求的子列表.
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]
Run Code Online (Sandbox Code Playgroud)
我试过的代码和结果:
for sublist in lst:
if sum(sublist) not in spectrum:
sublist.pop()
>>> [[], [], [], [], [], [], [], [113], [], [], [128], [], [], [], [], [], [186]]
Run Code Online (Sandbox Code Playgroud)
子列表是否包含方括号?那么为什么当我弹出子列表时,括号仍然存在?我怎么解决这个问题?我也试过,lst.pop(sublist)但它保留了一些不符合要求的子列表.
听起来你想要filter一个列表只留下通过一定条件的项目.有一个内置的filter,结合了一个lambda,我们得到:
lst = filter(lambda x: sum(x) in spectrum, lst)
Run Code Online (Sandbox Code Playgroud)
这也可以写成列表理解(如在过滤器上的文档中所述):
lst = [x for x in list if sum(x) in spectrum]
Run Code Online (Sandbox Code Playgroud)
时间更快:
>>> 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]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,list-comprehension更快,但通常使用filter内置的更复杂的过滤是首选.