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

时间:2017-07-07 18:30:33

标签: python python-3.x data-structures tuples

只是一个快速提问的人,我有很多这样的元组列表:

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

如何从('[', '1O--'), ("'", '1B--'),("'", '1B--'), (']', '1C--')删除所有这些元组(*):a_lis

我试图:

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

但是,我得到了一个非迭代错误,这是从列表中删除这些元组(*)的更好方法,以获得?:

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

2 个答案:

答案 0 :(得分:2)

那是因为你给过滤器的参数顺序不正确。

只需使用

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

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

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

编辑:如下面的评论中所述,上面的代码使flat_list成为生成器。要获得具体列表,只需使用列表推导:

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

OR

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

答案 1 :(得分: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可以解决这个问题,但需要更多开销,因为这不是核心包/数据类型。