2016-03-03 51 views
1

我有兩個嵌套列表:如何合併和格式列表

l1 = [['a', 'b'], ['d', 'b'], ['b', 'c'], ['a', 'c'], ['c', 'd'], ['b', 'a'], ['d', 'a']] 
l2 = [['a', 'alpha'], ['b', 'beta'], ['c', 'gamma'], ['d', 'delta']] 

l1是完全無序,但l2是按字母順序排列,在相關情況)

基本上我想結束與另一名單如下:

l3 = [['alpha', ['beta', 'gamma']], ['beta', ['alpha', 'gamma'], ['gamma', ['delta']], ['delta', ['alpha']] 

所以:合併內l1共享一個共同的第一個元素,則r名單用l2中相應的值替換l1中的所有值,最後以l3的方式格式化它們(使用嵌套列表例如['beta', 'gamma']按字母順序)。

This question類似於我想要做的,但我無法給出修改,以適應我的問題的答案。)

謝謝!

+0

看起來你想在你的結果中應該是字典而不是列表的列表?你確定你想在那裏使用一個列表嗎? – IanAuld

+0

你是不是要在'['d','b'] ['b','c']'和'['b','a'] ['d','a']之間加逗號「在'l1'中? – Jarad

+0

@IanAuld:是的,對不起,我已經離開Python很長一段時間,完全忘記了字典! – Grinchell

回答

3

您可以使用字典(a)將字母映射到單詞,以及(b)合併列表。特別是,看看collections.defaultdict,使其更容易。

>>> l1 = [['a', 'b'], ['d', 'b'], ['b', 'c'], ['a', 'c'], ['c', 'd'], ['b', 'a'], ['d', 'a']] 
>>> l2 = [['a', 'alpha'], ['b', 'beta'], ['c', 'gamma'], ['d', 'delta']] 
>>> d2 = dict(l2) 
>>> d3 = collections.defaultdict(list) 
>>> for x, y in l1: 
...  d3[d2[x]].append(d2[y]) 
... 
>>> d3 
defaultdict(<type 'list'>, {'alpha': ['beta', 'gamma'], 
          'beta': ['gamma', 'alpha'], 
          'gamma': ['delta'], 
          'delta': ['beta', 'alpha']}) 

如果你喜歡的結果排序列表的列表,只得到從字典中items

>>> sorted([k, sorted(v)] for k, v in d3.items()) 
[['alpha', ['beta', 'gamma']], 
['beta', ['alpha', 'gamma']], 
['delta', ['alpha', 'beta']], 
['gamma', ['delta']]] 
+0

我輸入了一個解決方案,然後意識到這是除了變量名稱相同。 –

+0

謝謝,完美的作品!我一定會進一步研究defaultdict。 – Grinchell