2016-12-04 21 views
0

输入:算法减少2D列表其独特的元件,维持秩序

[[102, 106], [106, 107], [101, 106], [104, 105, 106], [105], [103, 105], [104]]

希望的输出:

[102, 107, 101, 106, 105, 103, 104]

原始数组的每个索引实质上是可能性的列表为结果数组中的索引。目标是在结果数组中表示每个数字一次。我很难为此任务找到适当类型的算法。人们会采取什么样的普遍方法来解决这种问题?

+0

什么你确切地说是唯一的意思?我发现这个问题有点模糊,因为它现在是... –

+0

每个数字应该出现在最终列表中,并且可以从位于同一索引中的原始数组中选择每个索引。 – JTApps

+0

啊,所以你基本上是在寻找一个一维数独谜题的求解器,其中数组给出了给定位置所有允许的数字,每个数字只能出现在1个位置? –

回答

2

这里的,只是使用的所有解决方案的一个关键的set的长度max一个简单的解决方案:

>>> import itertools as it 
>>> data = [[102, 106], [106, 107], [101, 106], [104, 105, 106], [105], [103, 105], [104]] 
>>> max(it.product(*data), key=lambda x: len(set(x))) 
(102, 107, 101, 106, 105, 103, 104) 
+0

我喜欢它。 lambda的好用法 –

+0

这是超级聪明的,适合我的目的。谢谢! – JTApps

1

你可以使用unique_everseen你已经夷为平地名单后:

# sample input 
data = [[102, 106], [106, 107], [101, 106], [104, 105, 106], [105], [103, 105], [104]] 

from more_itertools import unique_everseen 
data = list(unique_everseen([a for sub in data for a in sub])) 
+0

注:'more_itertools'需要使用'pip'明确安装。 –