只是一个快速提问的人,我有很多这样的元组列表:
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')]
答案 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
可以解决这个问题,但需要更多开销,因为这不是核心包/数据类型。