关于python:从子列表列表中删除所有相同名称的项目

Remove all items of same name from list of sublists

我试图从包含子列表的列表中删除某个字符串的所有实例。例如,如下所示:

1
myarray = ['a', 'a', ['b', 'a', 'a'], ['a', 'c', 'd', 'a'], 'a', ['a', 'd']]

结果像这样

1
mylist = [['b'],['c','d'],['d']]

删除EDOCX1的所有实例后。

我使用了以下代码:

1
2
3
4
5
6
7
8
def delnodata(lst, what):
for index, item in enumerate(lst):
    if type(item) == list:
        delnodata(item, what)
    else:
        if item == what:
            lst.remove(item)
delnodata(mylist, 'a')

但产出是:

1
[['b', 'a'], ['c', 'd'], 'a', ['a', 'd']]

我在这个网站上看到过很多类似的问题,但不幸的是,我的编程技能还不够好,我自己也无法将这些问题结合起来!


我会递归地这样做。这也适用于任意嵌套级别。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
myarray = ['a', 'a', ['b', 'a', 'a'], ['a', 'c', 'd', 'a'], 'a', ['a', 'd']]

def nestremove(lst, what):
    new = []
    for item in lst:
        if isinstance(item,list):
            new.append(nestremove(item,what))
        elif item != what:
            new.append(item)
    return new

print(myarray)
myarray = nestremove(myarray, 'a')
print(myarray)

函数返回一个新的列表,因此在迭代原始列表时,我们不必删除其中的项,正如其他人已经指出的那样,这可能很危险(请参见这个问题,尤其是注释)。相反,您可以重新分配myarray

输出:

1
2
['a', 'a', ['b', 'a', 'a'], ['a', 'c', 'd', 'a'], 'a', ['a', 'd']]
[['b'], ['c', 'd'], ['d']]


第一次用于for index, item in enumerate(lst[:]),所以它循环遍历lst的整个拷贝第二次delnodata(myarray, 'a')而不是你所说的delnodata(mylist, 'a')

1
2
3
4
5
6
7
8
9
10
11
myarray = ['a', 'a', ['b', 'a', 'a'], ['a', 'c', 'd', 'a'], 'a', ['a', 'd']]
def delnodata(lst, what):
    for index, item in enumerate(lst[:]):
        if type(item) == list: # This if statement is optional
            delnodata(item, what)
        else:
            if item == what:
                lst.remove(item)
    print lst

delnodata(myarray, 'a')


从列表中一次删除一个项目效率非常低,因为每次都需要移动以下项目来填充空间。您应该只创建一个新的筛选列表

1
2
3
4
5
6
>>> def remover(data, r):
...     return [remover(x, r) if isinstance(x, list) else x for x in data if x != r]
...
>>> myarray = ['a', 'a', ['b', 'a', 'a'], ['a', 'c', 'd', 'a'], 'a', ['a', 'd']]
>>> remover(myarray, 'a')
[['b'], ['c', 'd'], ['d']]


下面的代码返回一个新列表,删除了'a'。它不会在适当的位置修改列表,这会导致一些神秘的问题。

来源

1
2
3
4
5
6
7
8
9
10
11
12
myarray = ['a', 'a', ['b', 'a', 'a'], ['a', 'c', 'd', 'a'], 'a', ['a', 'd']]

def testme(data):
    for item in data:
        if type(item) is list:
            yield list( testme(item) )
        elif item != 'a':
            yield item

res = list( testme(myarray) )
print res
assert res==[['b'],['c','d'],['d']], res

输出

1
[['b'], ['c', 'd'], ['d']]