list of lists的常用元素

Common elements of list of lists of lists

我有一个列表列表列表。有什么办法可以得到这些的交集。例如:

a=[[[1, 2], [2, 3]], [[1, 2], [3, 4]], [[1, 2], [1, 4], [2, 4]]]

从这个我怎样才能得到 [1,2] 作为结果,这是这 3 个列表列表的共同元素?

我可能会这样做:

>>> sets = [set(tuple(lst) for lst in sublist) for sublist in a]
>>> sets
[set([(1, 2), (2, 3)]), set([(1, 2), (3, 4)]), set([(1, 2), (2, 4), (1, 4)])]
>>> sets[0].intersection(*sets[1:])
set([(1, 2)])

第一步是认识到一些 python 数据结构可以提供帮助。 set 如果项目是可散列的,则可以轻松找到交集。 list 不可哈希,但 tuple 可哈希,并且两者之间的转换很容易。所以第一步是把你的列表子列表变成一组元组。

这是第一行完成的:

sets = [set(tuple(lst) for lst in sublist) for sublist in a]

从这里开始,假设您在 sets 中至少有一个集合,您可以只选择第一个并将其与其余所有相交 1。写得比上面稍微冗长一点:

first_set = sets[0]
rest_of_sets = sets[1:]
intersection = first_set.intersection(*rest_of_sets)

现在你有了一个交集(它是一个包含 tupleset)。如果您愿意,我们可以轻松地将其分解回列表中:

list_intersection = [list(item) for item in intersection]

1你也可以写成:intersection = set.intersection(*sets) -- 甚至可以是tiny 效率高一点...