我有一个 input_list = [[1,2],[1,3],[1,4],[2,8],[2,10]]
然后我有一个 elimination_list = [[1,2],[2,8]]
然后我用输入列表的元组创建一个result_list,除了那些在 elimination_list 中找到的元组
因此 result_list = [[1,3],[1,4],[2,10]]
我可以像下面这样使用多个 for 循环来实现这一点,但是有什么方法可以用更少的代码行来做到这一点吗?
for x,y in input_list:
is_eliminate = 0
for a,b in elimination_list:
if x == a and y == b:
is_eliminate = 1
if is_eliminate == 0:
result_list.append([x,y])
请您参考如下方法:
您可以只使用包含测试(in)和列表理解:
result_list = [t for t in input_list if t not in elimination_list]
t not in elimination_list 负遏制测试将遍历整个 elimination_list 以查看该元素是否存在。
如果您可以将列表转换为实际的元组,则可以使用更快的选项设置成员资格测试:
input_list = [(1, 2), (1, 3), (1, 4), (2, 8), (2, 10)]
elimination_set = {(1, 2), (2, 8)}
result_list = [t for t in input_list if t not in elimination_set]
这里 eliminitaion_set 是一个包含元组(不可变序列)的集合,不在 eliminitaion_set 中的 t 使用散列算法来确定任何给定的元组是否是平均 O 中的成员(1)(常数)时间。
不过,您没有将input_list 转换为元组;您可以仅在测试时进行转换:
input_list = [[1, 2], [1, 3], [1, 4], [2, 8], [2, 10]]
elimination_set = {(1, 2), (2, 8)}
result_list = [t for t in input_list if tuple(t) not in elimination_set]
