为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

森林海 2021-08-24 19:11:38
说我有一个清单 [2, 3, 7, 2, 3, 8, 7, 3]我想从上面的列表中生成包含相同值的列表。预期输出类似于:[2, 2][3, 3, 3][7, 7][8]这些列表的生成顺序无关紧要。
查看完整描述

3 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

试试这个


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]


查看完整回答
反对 回复 2021-08-24
?
守着一只汪

TA贡献1872条经验 获得超3个赞

最好的方法是一个O(n)解决方案collections.defaultdict:


>>> l = [2, 3, 7, 2, 3, 8, 7, 3]

>>> d = defaultdict(list)

>>> for e in l:

...     d[e].append(e)

... 

>>> d

defaultdict(<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)):

...     print(list(l))

... 

[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 timeit



setup = (

"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):

  print(call)

  print(timeit(call, setup))

结果:


d = defaultdict(list); 

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

这是现场测试


查看完整回答
反对 回复 2021-08-24
?
慕容3067478

TA贡献1773条经验 获得超3个赞

这是使用的一种简短方法 Counter


from collections import Counter

my_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()] 

输出:


[[2, 2], [3, 3, 3], [7, 7], [8]]


查看完整回答
反对 回复 2021-08-24
  • 3 回答
  • 0 关注
  • 224 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号