将子列表合并到基于python中的子列表项的列表中

时间:2017-06-11 02:02:35

标签: python list python-3.x list-comprehension

输入:

我有这个有序列表。

[[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']}

最简单,最简单的方法是什么?

8 个答案:

答案 0 :(得分:4)

如果订购了数据,则 var controller = function($scope){ $scope.question = { question_title: $scope.myJson.Q_id }; } 是一种很好的方法:

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']]
>>>

答案 1 :(得分:2)

您可以使用groupby模块中的itertools,例如:

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']]

然后将最终列表转换为dict,你可以这样做:

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']}}

答案 2 :(得分: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']}

答案 3 :(得分: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 :(得分: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']]

答案 5 :(得分: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)

答案 6 :(得分: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投了一个答案。

答案 7 :(得分:0)

dic = {} res_lst = [] lst = [[1,'A'],[1,'B'],[1,'D'],[2,'A'],[2,'D'],[3,'C'] ,[4,'D'],[5,'B'],[6,'D']]

转换为列表对

for lst_item in lst:
    if lst_item[0] in dic:
        for item in lst_item[1:]:
            dic[lst_item[0]].append(item)
    else:
        dic[lst_item[0]] = lst_item[1:]

转换为键值对

for item in dic:
    lst1 = []
    lst1.append(item)
    if(len(dic[item]) == 1):
        lst1.append(dic[item][0])
    else:
        lst1.append(dic[item])
    res_lst.append(lst1)
print(res_lst)