【发布时间】:2021-03-03 13:54:59
【问题描述】:
我有一个用整数填充的列表列表。这些整数表示图中的节点,主列表中的列表表示图中的循环。我想按照列表列表的顺序提取一组唯一的节点 - 每个循环中的一个节点。
示例:
我知道,不可能有一个只有两个节点的循环,但这是我想出的最简单的非平凡示例,它应该清楚我在寻找什么。
cycles = [[11, 22, 55], [22, 44], [11, 33], [22, 33]]
result = [11, 44, 33, 22]
另一个可能的结果是[22, 44, 11, 33]
我的解决方案:
到目前为止,我尝试使用itertools.product 来遍历列表列表中的所有元素组合,直到找到与主列表中列表数量相同长度的集合。
def find_random_unique_combination_from_cycles(cycles):
only_one = dict()
for ci, cy in enumerate(cycles):
for element in cy:
if len([element for cyc in cycles if element in cyc]) == 1:
only_one.update({element: ci})
prod_cycles = [cycle for ci, cycle in enumerate(cycles) if ci not in only_one.values()]
cycle_length = len(prod_cycles)
result = []
for combi in it.product(*prod_cycles, repeat=1):
if len(set(combi)) == cycle_length:
result = list(combi)
break
for element, index in only_one.items():
result.insert(index, element)
return result
问题:
此解决方案对于上述示例和类似情况非常有效。但是对于具有更多和更大周期的更大图,它在适当的运行时找不到解决方案(我不得不停止执行包含约 200 个周期的列表)。我还尝试通过删除只有一个唯一元素的所有循环来减小列表列表的大小,但这并没有太大帮助。 有没有更好更快的方法从每个列表列表中查找单个唯一元素?
非常感谢您的帮助!提前致谢!
【问题讨论】:
-
你能定义
Uniqueness吗?为什么11而不是22?可以是 22 而不是 11? -
另一个可能的结果是:[22, 44, 11, 33]
-
不知道解决方案是否有效
-
list(set([item for l in loops for item in l]))
-
谢谢!我的例子不够精确!我对其进行了编辑...在这种情况下,您将拥有比循环更多的独特元素!