2016-12-04 25 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'明確安裝。 –