python-列表中列表之间的公共列表

python-列表中列表之间的公共列表,python,list,coordinate,Python,List,Coordinate,我需要能够在不同数量的列表之间找到第一个公共列表(在本例中是坐标列表) i、 e.这份清单 >>> [[[1,2],[3,4],[6,7]],[[3,4],[5,9],[8,3],[4,2]],[[3,4],[9,9]]] 应该回来 >>> [3,4] 如果更简单,我可以在包含坐标的列表之间使用所有公共列表(坐标)的列表 我不能使用集合或字典,因为列表是不可散列的(我想是吧?)正确,list对象是不可散列的,因为它们是可变的元组对象是可散列的(前提是它们的

我需要能够在不同数量的列表之间找到第一个公共列表(在本例中是坐标列表)

i、 e.这份清单

>>> [[[1,2],[3,4],[6,7]],[[3,4],[5,9],[8,3],[4,2]],[[3,4],[9,9]]]
应该回来

>>> [3,4]
如果更简单,我可以在包含坐标的列表之间使用所有公共列表(坐标)的列表


我不能使用集合或字典,因为列表是不可散列的(我想是吧?)

正确,
list
对象是不可散列的,因为它们是可变的<代码>元组对象是可散列的(前提是它们的所有元素都是可散列的)。由于最里面的列表都是整数,这为解决列表的非散列性提供了一个极好的机会:

>>> 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
是通过在
列表[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

如果要查找在所有父列表中通用的第一个子列表,则以下操作将起作用

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

具有递归函数的解决方案。:)

这将获取第一个重复的元素

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]

您可以通过列表理解来实现这一点:

>>> l = [[[1,2],[3,4],[6,7]],[[3,4],[5,9],[8,3],[4,2]],[[3,4],[9,9]]]
>>> lcombined =  sum(l, [])
>>> [k[0] for k in [(i,lcombined.count(i)) for i in lcombined] if k[1] > 1][0]
[3, 4]

-1我认为这并不能保证找到第一个公共副本+1,因为问题的内容也是“如果更简单,我可以在包含坐标的列表之间使用所有公共列表(坐标)的列表。”@wim——这很公平。我没有看到第一个标准。尽管如此,我也不确定这是否是一个很好的定义。考虑<代码> [[[1,2],[2.1] ],[[2,1],[1,2] ] < /代码>。首先是什么?@wim——如果您确实需要,您可以根据输出在原始列表中的位置(任意选择?)对其进行排序。我仍然认为这可能比基于
列表的解决方案更有效。据我所知,
[1,2]
将是这种情况下的第一个解决方案,但也许我在做假设。我还认为这个问题意味着需要在重复列表上引用,而您的方法将生成一个副本,而无法修改实际的副本。不幸的是,这在算法上很慢:首先创建集合(如mglison的回答中)对于每个列表
r
和每个元素
x
进行的测试比
x in r
测试快得多。但是,这具有返回
first
中的第一个元素
x
的优点,因此这可能足够好了,具体取决于需要:+1。在某些应用程序中,将
rest
中的元素转换为元组可能更有效,如在mgilson的回答中。是“公共”意思“包含在每个列表中”还是“列表中不唯一”?这不起作用:只返回在所有列表中找到的元素,而不是在多个列表中找到的元素。