python - 列表中列表的共同元素

3 投票
4 回答
852 浏览
提问于 2025-04-17 16:13

我需要找到多个列表中第一个共同的列表(在这个情况下是坐标列表)。

也就是说,这个列表

>>> [[[1,2],[3,4],[6,7]],[[3,4],[5,9],[8,3],[4,2]],[[3,4],[9,9]]]

应该返回

>>> [3,4]

如果这样做更简单,我也可以处理一个包含所有共同列表(坐标)的列表,这些列表里有坐标。

我不能使用集合或字典,因为列表是不可哈希的(我想是这样?)。

4 个回答

0

这是一个使用递归函数的解决方案。 :)

这个方法可以找到第一个重复的元素。

def get_duplicated_element(array):
    global result, checked_elements
    checked_elements = []
    result = -1
    def array_recursive_check(array):
        global result, checked_elements
        if result != -1: return
        for i in array:
            if type(i) == list:
                if i in checked_elements:
                    result = i
                    return
                checked_elements.append(i)
                array_recursive_check(i)
    array_recursive_check(array)
    return result

get_duplicated_element([[[1,2],[3,4],[6,7]],[[3,4],[5,9],[8,3],[4,2]],[[3,4],[9,9]]])
[3, 4]
1

如果你想找到所有父列表中都共有的第一个子列表,可以使用下面的方法。

def first_common(lst):
    first = lst[0]
    rest = lst[1:]
    for x in first:
        if all(x in r for r in rest):
            return x
8

没错,list(列表)对象是不可哈希的,因为它们是可变的。而tuple(元组)对象是可哈希的(前提是它里面的所有元素都是可哈希的)。由于你最里面的列表都是整数,这就给我们提供了一个很好的机会来绕过列表不可哈希的问题:

>>> lists = [[[1,2],[3,4],[6,7]],[[3,4],[5,9],[8,3],[4,2]],[[3,4],[9,9]]]
>>> sets = [set(tuple(x) for x in y) for y in lists]
>>> set.intersection(*sets)
set([(3, 4)])

在这里,我给你一个集合,里面包含了所有子列表中存在的坐标元组。要想得到一个像你开始时那样的列表:

[list(x) for x in set.intersection(*sets)]

这样就可以了。

针对@wim的担忧,如果你真的想要一个对交集中的第一个元素的引用(这里的first是指在lists[0]中第一个出现的元素),最简单的方法可能是这样:

#... Stuff as before
intersection = set.intersection(*sets)
reference_to_first = next( (x for x in lists[0] if tuple(x) in intersection), None ) 

如果交集为空,这个方法会返回None

撰写回答