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) |
函数返回一个新的列表,因此在迭代原始列表时,我们不必删除其中的项,正如其他人已经指出的那样,这可能很危险(请参见这个问题,尤其是注释)。相反,您可以重新分配
输出:
1 2 | ['a', 'a', ['b', 'a', 'a'], ['a', 'c', 'd', 'a'], 'a', ['a', 'd']] [['b'], ['c', 'd'], ['d']] |
号
第一次用于
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']] |
。
下面的代码返回一个新列表,删除了
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']] |
。