如果在另一个列表中(列表列表),从列表中删除项目

时间:2017-12-07 10:35:44

标签: python

我有一个看起来像这样的列表

a = [('Eth1', 'desc', 'date'), ('Eth2', 'dest', 'date'), ('Eth3', 'dest', 'date')]

我有另一个列表:

b = = ['Eth1', 'Eth2']

我想删除a中所有出现的b及其相应的数据,所以在我有

的那一刻
c = list(set(a) - set(b))
print c

我希望c看起来像这样

c = ['Eth3', 'dest', 'date']

但它只是以不同的顺序打印列表,比如

[('Eth2', 'dest', 'date'), ('Eth1', 'desc', 'date'), ('Eth3', 'dest', 'date')]

最好的方法是什么?

2 个答案:

答案 0 :(得分:3)

您需要列表理解:

In [4]: [tup for tup in a if tup[0] not in b]
Out[4]: [('Eth3', 'dest', 'date')]

请注意,您无法在此处使用set的操作,因为您不想完全比较元组,而是首先比较元组(然后根据它删除整个元组) )。

此外,如果您的列表时间较长,最好使用set来保留b个项目。原因是成员资格检查是集合中的O(1)。

为了完整起见,这里也是一个功能性的解决方案(在这种情况下不推荐,特别是如果你想让结果成为一个列表):

In [7]: list(filter(lambda x: x[0] not in b, a))
Out[7]: [('Eth3', 'dest', 'date')]

答案 1 :(得分:0)

您也可以使用filter功能执行此操作:

a = [('Eth1', 'desc', 'date'), ('Eth2', 'dest', 'date'), ('Eth3', 'dest', 'date')]
b = ['Eth1', 'Eth2']

res = list(filter(lambda i: i[0] not in b, a))
print(res)

输出:

[('Eth3', 'dest', 'date')]