在列表列表中查找出现在两个列表中的元素

时间:2018-06-01 16:00:33

标签: python algorithm list set

我有一份清单清单:

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

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

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

现在我正在使用一堆for循环来做这件事,但这个速度非常慢......是否有更快的pythonic方法来实现这个目标?

2 个答案:

答案 0 :(得分:3)

您可以enumerate列表中的列表和项目,并为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 =梳子。列表的大小)。

答案 1 :(得分:0)

from itertools import combinations
search = list(combinations(range(len(solutions)), 2))

for i in search:
    res = list(set(solutions[i[0]]) & set(solutions[i[1]]))
    if len(res) != 0:
        save = [i, res[0]]

idxList1 = solutions[save[0][0]].index(save[1])
idxList2 = solutions[save[0][1]].index(save[1])

这可以做到它应该做的,但它似乎是一个糟糕的解决方案。