如何将列表中的相同值分组到它们自己的列表中?

说我有一个清单 [2, 3, 7, 2, 3, 8, 7, 3]


我想从上面的列表中生成包含相同值的列表。


预期输出类似于:


[2, 2]

[3, 3, 3]

[7, 7]

[8]

这些列表的生成顺序无关紧要。


森林海
浏览 225回答 3
3回答

慕斯709654

试试这个l = [2, 3, 7, 2, 3, 8, 7, 3]for i in set(l):   print([i]*l.count(i))输出:[8][2, 2][3, 3, 3][7, 7]

守着一只汪

最好的方法是一个O(n)解决方案collections.defaultdict:>>> l = [2, 3, 7, 2, 3, 8, 7, 3]>>> d = defaultdict(list)>>> for e in l:...&nbsp; &nbsp; &nbsp;d[e].append(e)...&nbsp;>>> ddefaultdict(<class 'list'>, {2: [2, 2], 3: [3, 3, 3], 7: [7, 7], 8: [8]})>>> d.values()dict_values([[2, 2], [3, 3, 3], [7, 7], [8]])或者,您可以使用itertools.groupby排序列表:>>> for _, l in itertools.groupby(sorted(l)):...&nbsp; &nbsp; &nbsp;print(list(l))...&nbsp;[2, 2][3, 3, 3][7, 7][8]或列表理解collections.Counter:>>> from collections import Counter>>> [[i]*n for i,n in Counter(l).items()][[2, 2], [3, 3, 3], [7, 7], [8]]正如我发布的那样,defaultdict 解决方案O(n)比其他方法更快。以下是测试:from timeit import timeitsetup = ("from collections import Counter, defaultdict;""from itertools import groupby;""l = [2, 3, 7, 2, 3, 8, 7, 3];")defaultdict_call = ("d = defaultdict(list); ""\nfor e in l: d[e].append(e);")groupby_call = "[list(g) for _,g in groupby(sorted(l))]"counter_call = "[[i]*n for i,n in Counter(l).items()]"for call in (defaultdict_call, groupby_call, counter_call):&nbsp; print(call)&nbsp; print(timeit(call, setup))结果:d = defaultdict(list);&nbsp;for e in l: d[e].append(e);7.02662614302244[list(g) for _,g in groupby(sorted(l))]10.126392606005538[[i]*n for i,n in Counter(l).items()]19.55539561196929这是现场测试

慕容3067478

这是使用的一种简短方法 Counterfrom collections import Countermy_dict = Counter([2, 3, 7, 2, 3, 8, 7, 3]) # returns {3: 3, 2: 2, 7: 2, 8: 1}new_list = [[k] * v for k,v in my_dict.items()]&nbsp;输出:[[2, 2], [3, 3, 3], [7, 7], [8]]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python