2017-04-06 84 views
0

我想找到一個相匹配另一個列表列表中的子表內,並從創建一個新的列表:識別子列表完全包含其他列表

所以我想這樣的:

Lista = [["a", "b", "c"],["d", "e", "f"]] 
Listb = ["b", "c", "d", "e", "f"] 

要產生這樣的:

newvariable = ["d", "e", "f"] 

因爲abclistb遏制,但d,e,f是。

我試過與all()循環,但似乎無法讓他們工作?

任何想法?我猜這是簡單的我錯過了。

+0

告訴我們你試過的什麼 – Ken

回答

2

最直接的解決方案是

>>> Lista = [["a", "b", "c"],["d", "e", "f"]] 
>>> Listb = ["b", "c", "d", "e", "f"] 
>>> set_b = set(Listb) 
>>> 
>>> [l for l in Lista if all(x in set_b for x in l)] 
[['d', 'e', 'f']] 

,讓你與所有從Lista包含在Listb名單列表。

請注意,我沒有使用Listb作爲實際控制檢查,而是使用集合set_b,因爲集合具有O(1)成員資格檢查。 (否則,上面的all-檢查將具有二次運行時間。)

我假定Listb中元素的順序無關緊要。如果有,請澄清。

+1

賓果,非常感謝你。 – Tubes63

0

在比較元素之前,可以使用iterations.chain來平鋪數組(或副本)。

然後,您可以將您的列表轉換爲具有負運算符的集合。

第二種解決方案 你可以做類似的事情遞歸枚舉列表。 高清list_walk(迭代器): 如果isinstance(迭代器,列表): 在迭代值: 在list_walk子值(迭代器): 產子值 其他: 產量迭代

然後使用同一套把戲如上。

相關問題