2017-06-11 60 views
2

輸入:將子列表合併到基於python子列表項的列表中

我有這個有序列表。

[[1, 'A'], [1, 'B'],[1, 'D'], [2, 'A'],[2,'D'], [3, 'C'], [4, 'D'], [5, 'B'], [6, 'D']] 

希望的輸出

[[1,['A','B','D']],[2, ['A','D']], [3, 'C'], [4, 'D'], [5, 'B'], [6, 'D']] 

由於這兩個子列表的第一項是一樣的。

我也可以轉換成一個關鍵字和這些值的字典對。像

{1:['A','B','D'],2:['A','D'],3:['C']} 

什麼是最簡單最簡單的方法呢?

+0

是訂購的輸入列表 – Serge

+1

如果在外部列表的末尾有一個'[1,'C']'?應該把它與前兩個分組嗎?這個問題有點低估。 –

+0

我已經指定它更清楚現在採取戰利品@Serge – void

回答

2

您可以使用groupbyitertools模塊這樣的例子:

a = [[1, 'A'], [1, 'B'],[1, 'D'], [2, 'A'],[2,'D'], [3, 'C'], [4, 'D'], [5, 'B'], [6, 'D']] 

final = [] 
for k, v in groupby(sorted(a, key=lambda x: x[0]), lambda x: x[0]): 
     bb = list(v) 
     if len(bb) > 1: 
      final.append([k, [j for _, j in bb]]) 
     else: 
      final.append([k, bb[0][1]]) 

# OR: 
# Within a list comprehension 
# final = [[k, [j[1] for j in list(v)]] for k, v in groupby(sorted(a, key=lambda x: x[0]), lambda x: x[0])] 

print(final) 

輸出:

[[1, ['A', 'B', 'D']], 
[2, ['A', 'D']], 
[3, 'C'], 
[4, 'D'], 
[5, 'B'], 
[6, 'D']] 

再到最後列表轉換成一個字典,你可以這樣做:

final_dict = {k:v if isinstance(v, list) else [v] for k, v in final} 
print(final_dict) 

輸出:

{1: ['A', 'B', 'D'], 2: ['A', 'D'], 3: ['C'], 4: ['D'], 5: ['B'], 6: ['D']}} 
1
in_list 
out_list = [] 
sublist = [] 
i = 0 
for l in in_list: 
    if l[0] != i: 
     i = l[0] 
     sublist = [] 
     out_list.append([i, sublist]) 
    sublist.append(l[1]) 
dico = dict(out_list) 
2

您可以直接從輸入創建字典。

from collections import defaultdict 

input = [[1, 'A'], [1, 'B'],[1, 'D'], [2, 'A'],[2,'D'], [3, 'C'], [4, 'D'], [5, 'B'], [6, 'D']] 

d = defaultdict(list) 
for el in input: d[el[0]].append(el[1]) 

d輸出將是:

{1: ['A', 'B', 'D'], 2: ['A', 'D'], 3: ['C'], 4: ['D'], 5: ['B'], 6: ['D']} 
2

如果順序並不重要,你想反正詞典:

import collections 

your_list = [[1,'A'], [1,'B'], [1,'D'], [2,'A'], [2,'D'], [3,'C'], [4,'D'], [5,'B'], [6,'D']] 

result = collections.defaultdict(list) 
for k, v in your_list: 
    result[k].append(v) 

# {1: ['A', 'B', 'D'], 2: ['A', 'D'], 3: ['C'], 4: ['D'], 5: ['B'], 6: ['D']} 

你也可以不用collections.defaultdict(可能在某些性能損失下,取決於關鍵頻率):

your_list = [[1,'A'], [1,'B'], [1,'D'], [2,'A'], [2,'D'], [3,'C'], [4,'D'], [5,'B'], [6,'D']] 

result = {} 
for k, v in your_list: 
    result[k] = result.get(k, []) + [v] 

# {1: ['A', 'B', 'D'], 2: ['A', 'D'], 3: ['C'], 4: ['D'], 5: ['B'], 6: ['D']} 
4

如果數據是有序的,那麼itertools.groupby是一個好辦法:

>>> from itertools import groupby 
>>> from operator import itemgetter 
>>> data = [[1, 'A'], [1, 'B'], [2, 'A'], [3, 'C'], [4, 'D'], [5, 'B'], [6, 'D']] 
>>> final_data = [] 
>>> final_data = [] 
>>> for k, g in groupby(data, itemgetter(0)): 
...  group = list(g) 
...  if len(group) == 1: 
...   final_data.append(group[0]) 
...  else: 
...   final_data.append([k, [sub[1] for sub in group]]) 
... 
>>> final_data 
[[1, ['A', 'B']], [2, 'A'], [3, 'C'], [4, 'D'], [5, 'B'], [6, 'D']] 
>>> 

如果你想在一本字典的結果,那就是更容易:

>>> grouped_dict = {} 
>>> for num, letter in data: 
...  grouped_dict.setdefault(num, []).append(letter) 
... 
>>> grouped_dict 
{1: ['A', 'B'], 2: ['A'], 3: ['C'], 4: ['D'], 5: ['B'], 6: ['D']} 
>>> 
2

我找到了更好的做相反,而不是做一個列表,然後是一個字典,我做了字典,然後是一個列表。

輸入:

in_list = [[1, 'A'], [1, 'B'],[1, 'D'], [2, 'A'],[2,'D'], [3, 'C'], [4, 'D'], [5, 'B'], [6, 'D']] 

代碼:

mydict = {} 
for sublist in in_list: 
    if sublist[0] in mydict.keys(): 
     mydict[sublist[0]] = [*mydict[sublist[0]],sublist[1]] 
    else: 
     mydict[sublist[0]] = sublist[1] 

輸出:

>>> mydict 
{1: ['A', 'B', 'D'], 2: ['A', 'D'], 3: 'C', 4: 'D', 5: 'B', 6: 'D'} 

做一個簡單的列表,從詞典:

mylist = list(mydict.items()) 

輸出:

>>> mylist 
[(1, ['A', 'B', 'D']), (2, ['A', 'D']), (3, 'C'), (4, 'D'), (5, 'B'), (6, 'D')] 

讓另一個列表,從詞典:

mylist = = [[k,v] for k,v in mydict.items()] 

同:

mylist = [] 
for key, value in mydict.items(): 

輸出:

>>> mylist 
[[1, ['A', 'B', 'D']], [2, ['A', 'D']], [3, 'C'], [4, 'D'], [5, 'B'], [6, 'D']] 
0

在python文檔示例中,https://docs.python.org/2/library/collections.html#defaultdict-examples 他們在您的帖子中使用了相同的問題。

>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] 
>>> d = defaultdict(list) 
>>> for k, v in s: 
...  d[k].append(v) 
... 
>>> d.items() 
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])] 

然後我投了一個答案與defaultdict。

相關問題