递归删除列表元素Python

时间:2018-01-09 09:40:48

标签: python recursion tail-recursion

需要编写一个recurive函数来删除list的元素,但是将数组保存在结果中,例如。

def remove_words(listx):
    for element in listx:
        if isinstance(element, list):
            remove_words(element)
        else:
            listx.remove(element)

    return listx

remove_words(["a", "b", ["c"]])会返回[[]]

由于某些原因,我的代码会返回["b",[]]

2 个答案:

答案 0 :(得分:2)

迭代时不要从集合中删除元素。重复调用list.remove也不是理想的性能,因为每次删除(来自随机索引)都是O(N)。围绕这两个问题的简单方法是以下理解:

def remove_words(listx):
    return [remove_words(e) for e in listx if isinstance(e, list)]

看似缺失的基本案例是一个没有嵌套列表的列表,其中返回了一个空列表。

如果要就地修改列表,可以使用切片分配:

def remove_words(listx):
    listx[:] = [remove_words(e) for e in listx if isinstance(e, list)]

答案 1 :(得分:0)

def remove_words(listx):
  if listx == []:
    return []
  elif not isinstance(listx[0], list):
    return remove_words(listx[1:])
  else:
    return [remove_words(listx[0])] + remove_words(listx[1:])

print(remove_words(["a", "b", ["c"]]))
print(remove_words(["a", ["b",["c","d"],"c"], [["f"],["g"]],"h"]))