python - 在 2 个列表中搜索相同的值,但如果重复则只搜索一次

标签 python list duplicates

lst1 = [0.0, 2.0, 2.0, 3.0, 4.0, 6.0, 6.0, 7.0, 8.0, 8.0, 10.0, 10.0, 10.0, 13.0]
lst2 = [4.,  8.]
[i for i, j in enumerate(lst1) if j in lst2]

我会得到返回:

[4, 8, 9]

我想要实现的是我想要的返回:

[4, 8]

因为 8.0lst1 中重复,我只想要一次。实现这一目标的最佳方式是什么?

最佳答案

我能想到的最好的方法是,维护一组已经看到的数字,如果该数字不在已经看到的 seen 集合中,则将 index 添加到resultseen 集合的编号。

result, seen = [], set()
for index, item in enumerate(lst1):
    if item not in seen and item in lst2:
        result.append(index)
        seen.add(item)
print(result)
# [4, 8]

注意 1: 我们使用 set 来维护 seen 项目,因为查找会非常快(恒定时间查找)

注意 2:如果您的 lst2 也将是一个长列表,那么最好将其转换为一个集合,以便 lst2 中的项目 查找也将在恒定时间内发生。所以实际的代码变成了,

result, seen, set2 = [], set(), set(lst2)
for index, item in enumerate(lst1):
    if item not in seen and item in set2:
        result.append(index)
        seen.add(item)
print(result)
# [4, 8]

如果 lst2 会很长,这将提供比第一个版本更好的性能。

受 DSM 解决方案启发的替代解决方案是,构建一个反向索引字典,如下所示

>>> reverse_indexes = {lst1[i]: i for index in xrange(len(lst1) - 1, -1, -1)}

然后我们可以像这样简单地进行查找

>>> [reverse_indexes[item] for item in lst2 if item in reverse_indexes]
[4, 8]

关于python - 在 2 个列表中搜索相同的值,但如果重复则只搜索一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29320776/

相关文章:

python - 比较两个文本列表,检查是否重复并将其标记为行尾

linux - 在文件中查找部分重复行并计算每行重复了多少次?

list - 从列表中删除重复项(在 vim 中)

python - 异步函数中的"RecursionError: maximum recursion depth exceeded in comparison"

python - 使用 POST 和 urllib2 访问 Web API

python - 函数平方二维数组python

c++ - 列表插入STL

python - 将 2D Numpy 灰度值数组转换为 PIL 图像

python - 如何相互验证 wtforms 字段?

c - 解读自定义循环双向链表的循环条件