我需要能够在可变数量的列表之间找到第一个公共(public)列表(在本例中是坐标列表)。
即这个列表
>>> [[[1,2],[3,4],[6,7]],[[3,4],[5,9],[8,3],[4,2]],[[3,4],[9,9]]]
应该返回
>>> [3,4]
如果更简单,我可以使用包含坐标的列表之间的所有公共(public)列表(坐标)的列表。
我不能使用集合或字典,因为列表不可散列(我认为?)。
最佳答案
正确,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 元素(其中定义了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
。
关于python - 列表中列表之间的公共(public)列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14929091/