微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何对列表中的元素进行分组?

如何解决如何对列表中的元素进行分组?

我有一个清单清单。每个列表包含三个元素,将它们称为[number,letter,time]。看起来像这样:

my_list = [[0,'a','0:00'],[1,'1:00'],[2,'b','2:00'],[3,'c','3:00'],[4,'4:00'],[5,'5:00'],[6,'d','6:00'],[7,'7:00'],[8,'8:00'],[9,'e','9:00']]

我要设置此列表的格式,以使element[1](每个嵌套列表的letter)成为新嵌套列表的element[0],出现number和{ {1}}分别为timeelement[1]

我想要的输出应该像这样

element[2]

到目前为止,我已经使用my list = [['a',[0,1,5],['0:00','1:00','5:00']],['b',4,8],['2:00','4:00','8:00']],['c',7],['3:00','7:00']],['d',[6],['6:00']],['e',[9],['9:00']]] 获取collections.Counter()的频率

letter

我相信我可以使用列表理解来使用>>> letter_count = Counter([element[1] for element in my_list]) >>> letter_count Counter({'a': 3,'b': 3,'c': 2,'d': 1,'e': 1}) 和条件字符串来完成其余的过程,但是我遇到了麻烦。有什么建议吗?

此外,欢迎大家提出有关更好,更具描述性的标题的建议(为了后代)。

解决方法

out = {}
for a,b,c in my_list:
    out.setdefault(b,[]).append((a,c))

out = [[k,[i for i,_ in v],[i for _,i in v]]  for k,v in out.items()]

print(out)

打印:

[['a',[0,1,5],['0:00','1:00','5:00']],['b',[2,4,8],['2:00','4:00','8:00']],['c',[3,7],['3:00','7:00']],['d',[6],['6:00']],['e',[9],['9:00']]]
,

另一种方法是使用itertools.groupby

import itertools

new_list = []
my_list = sorted(my_list,key=lambda row: row[1])
for name,groups in itertools.groupby(my_list,key=lambda row: row[1]):
    groups = list(zip(*groups))
    
    grouped_item = [name,groups[0],groups[2]]
    new_list.append(grouped_item)
    
print(new_list)
[['a',(0,5),('0:00','5:00')],(2,8),('2:00','8:00')],(3,7),('3:00','7:00')],(6,),('6:00',)],(9,('9:00',)]]
,

这是一种快速的肮脏方法(与当前其他答案效率相同,但代码更多)

my_list = [[0,'a','0:00'],[1,'1:00'],'b','2:00'],'c','3:00'],[4,'4:00'],[5,'5:00'],[6,'d','6:00'],[7,'7:00'],[8,'8:00'],[9,'e','9:00']]

tmp_dict = {}

for first,second,third in my_list:
    if second not in tmp_dict:
        tmp_dict[second] = [[],[]]

    tmp_dict[second][0].append(first)
    tmp_dict[second][1].append(third)

new_list = []

for key,val in tmp_dict.items():
    new_list.append([key] + val)

print(new_list)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。