我需要能够在可变数量的列表之间找到第一个公共列表(在这种情况下是一个坐标列表)。
即。这个清单
>>> [[[1,2],[3,4],[6,7]],[[3,4],[5,9],[8,3],[4,2]],[[3,4],[9,9]]]
应该返回
>>> [3,4]
如果更简单,我可以处理包含坐标的列表之间所有常用列表(坐标)的列表。
我不能使用集合或词典,因为列表不可清除(我认为?)。
答案 0 :(得分: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
。
答案 1 :(得分: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
答案 2 :(得分: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]
答案 3 :(得分:-1)
你可以通过列表理解实现这一目标:
>>> 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]