我有一个看起来像这样的列表
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')]
最好的方法是什么?
答案 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')]