尝试从列表中删除一组元组时出现问题?

2024-09-29 00:18:59 发布

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

我有一长串元组,像这样:

a_lis = [('[', '1O--'), ("'", '1B--'),('hi', 'SDFD29384'), ('there','2398SDFDSF'),("'", '1B--'), (']', '1C--')]

如何从a_lis中删除所有元组(*):('[', '1O--'), ("'", '1B--'),("'", '1B--'), (']', '1C--')?你知道吗

我试着:

flat_list = filter(flat_list, lambda x: x[0] == '[' && x[1] == "'")

但是,我得到了一个不可iterable的错误,为了得到?地址:

a_lis = [('hi', 'SDFD29384'), ('there','2398SDFDSF')]

Tags: lambda地址错误hifilteriterablelist元组
2条回答

那是因为你给filter的参数顺序不正确。你知道吗

只是使用

flat_list = filter(lambda x: x[0] != '[' and x[0] != "'", a_lis)

注意:查看您的数据,更好的方法如下所示:

flat_list = filter(lambda x: ' ' not in x[1], a_lis)

编辑:如下面的注释所述,上面的代码使平面列表成为生成器。要获得具体的列表,只需使用列表理解:

def should_remove(s):
    return '[' in s or ']' in s or "'" in s

flat_list = [x in a_lis if not should_remove(x[1])]

或者

flat_list = [x in a_lis if ' ' not in x[1]]

有一种方法:

>>> a_list = [('[', '1O '), ("'", '1B '),('hi', 'SDFD29384'), ('there','2398SDFDSF'),("'", '1B '), (']', '1C ')]
>>> b_list = [('[', '1O '), ("'", '1B '),("'", '1B '), (']', '1C ')]
>>> list(set(a_list) - set(b_list))
[('hi', 'SDFD29384'), ('there', '2398SDFDSF')]

另一种方法是:

>>> [ x for x in a_list if x not in b_list ]
[('hi', 'SDFD29384'), ('there', '2398SDFDSF')]

另外两种可能性:

>>> for x in b_list:
        try:
            a_list.remove(x)
        except ValueError:
            pass

这个函数实际上修改了a_list,因此根据上下文的不同,可能并不理想。有一种类似的方法涉及set.remove()甚至set.discard()(不需要try块)。你知道吗

请注意,任何基于set的方法都要求列表中的所有对象都是可散列的—在给出的示例中,它们都是元组,所以这很好。set方法中的另一个警告是,结果中幸存的项可能与原始项的顺序不同。使用OrderedSet可以解决这个问题,但是会带来更多的开销,因为这不是一个核心包/数据类型。你知道吗

相关问题 更多 >