[英]Merging sublists into a list based on sublist item in 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']}
执行此操作的最简单和最简单的方法是什么?
如果数据是有序的,那么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']}
>>>
您可以使用itertools
模块中的groupby
,如下例所示:
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']}}
您可以直接从输入创建字典。
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']}
如果顺序不重要,并且您仍然需要字典:
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']}
我发现最好做相反的事情,而不是先制作一个列表,然后再制作一个字典,我先制作了字典,然后再制作了一个列表。
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']]
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)
在 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 投票了一个答案。
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.