首页 > 解决方案 > 从嵌套列表中删除子列表(查找子列表的索引)

问题描述

我有一个这样的嵌套列表:

lists = [[['L', 5], ['B', 20], ['A', 10]], 
        [['B', 200], ['J', 90]], 
        [['L', 5], ['L', 6]], 
        [['A', 10], ['L', 12], ['A', 11], ['A', 15]]]

如何删除具有不是 A、B、L 的字符串的子列表(不仅删除不是 A、B、L 的列表,还删除整个子列表)如何找到无效项目所属的子列表的索引(在这种情况下是 1)(需要索引以完成进一步的任务)

这是我尝试过的,它可以找到无效的项目,但我不知道找到子列表的索引

for j in range (len(lists)):
    for i in range (len(lists[j])):
        if lists[j][i][0] != 'L' and lists[j][i][0] != 'A' and lists[j][i][0] != 'B':
            return False
return True 

我希望结果是这样的:

lists = [[['L', 5], ['B', 20], ['A', 10]],  
        [['L', 5], ['L', 6]], 
        [['A', 10], ['L', 12], ['A', 11], ['A', 15]]]

标签: pythonlistnested-lists

解决方案


您可以lists使用反向删除习语有效地就地修改:

keep = ('A', 'B', 'L')
for i in reversed(range(len(lists))):
    if any(l[0] not in keep for l in lists[i]):  
        del lists[i]

print(lists)
# [[['L', 5], ['B', 20], ['A', 10]],
#  [['L', 5], ['L', 6]],
#  [['A', 10], ['L', 12], ['A', 11], ['A', 15]]]

any如果任何子列表的第一个元素不在 中,则返回 True keep


或者,您可以使用列表推导创建一个新列表:

[l for l in lists if not any(l_[0] not in keep for l_ in l)]
# [[['L', 5], ['B', 20], ['A', 10]],
#  [['L', 5], ['L', 6]],
#  [['A', 10], ['L', 12], ['A', 11], ['A', 15]]]

推荐阅读