python - 列表中列表的共同元素
我需要找到多个列表中第一个共同的列表(在这个情况下是坐标列表)。
也就是说,这个列表
>>> [[[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
。