首页 > 解决方案 > 在列表列表中查找出现在两个列表中的元素

问题描述

我有一个列表列表:

[[10, 9, 8], [8, 7], [1, 2, 3]]

子列表的大小不一定相同。我需要找到一个出现在两个单独列表中的数字,并返回这些列表中的列表索引和数字索引。

在这种情况下,它将是 8,列表 0,列表 1,列表 0 idx 2,列表 1 idx 0。

现在我正在用一堆 for 循环来做这件事,但这太慢了……有没有更快、更 Python 的方式来实现这一点?

标签: pythonalgorithmlistset

解决方案


您可以enumerate列出列表中的列表和项目,并将每个元素的索引元组存储在 a 中dict,然后过滤那些出现两次以上的条目。

lst = [[10, 9, 8], [8, 7], [1, 2, 3]]
in_list = collections.defaultdict(list)
for i, x in enumerate(lst):
    for k, y in enumerate(x):
        in_list[y].append((i, k))

res = {k: v for k, v in in_list.items() if len(v) > 1}
# {8: [(0, 2), (1, 0)]}

(这假设没有元素在同一个子列表中出现多次。)

虽然这也使用了“一堆 for 循环”(取决于你对“一堆”的定义),它只会访问嵌套列表中的每个元素一次,给它 O(n) (n = comb. size of lists )。


推荐阅读