从子列表列表中删除所有同名项

2024-10-02 22:27:50 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

就这样结束了

^{pr2}$

删除'a'的所有实例后。在

我使用了以下代码:

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')

但结果是:

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

我在这个网站上看到过很多类似的问题,但不幸的是,我的编程技能还不足以让我自己把这些问题组合起来!在


Tags: 实例字符串代码in列表forindexif
3条回答

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

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)

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

输出:

^{pr2}$

首先用于for index, item in enumerate(lst[:]),所以它循环遍历lst第二个delnodata(myarray, 'a')而不是{}的整个副本

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')

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

来源

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

输出

^{pr2}$

相关问题 更多 >