如何在 Python 中对列表列表进行分组?

Jam*_*son 5 python list

我有一个看起来像这样的列表:

['user1', time, cpus, mem]  
['user1', time, cpus, mem]
['user2', time, cpus, mem]
['user3', time, cpus, mem]
Run Code Online (Sandbox Code Playgroud)

等等..

我只需要每个用户一个列表,将时间、CPU 和内存加在一起。我已经尝试了一些东西,但我不能让它工作。

ete*_*ene 6

一种甜蜜、Pythonic 且简洁的方法是:

from collections import defaultdict

l = [                  
    ['user1', 0, 1, 0],                                                    
    ['user2', 2, 2, 2],      
    ['user3', 2, 2, 1],
    ['user3', 1, 1, 2],
    ['user1', 1, 0, 1],
]


merged = defaultdict(lambda: [0, 0, 0])

for user, *values in l:               
     merged[user] = [sum(i) for i in zip(values, merged[user])]
Run Code Online (Sandbox Code Playgroud)

输出:

In : merged
Out: 
defaultdict(<function __main__.<lambda>>,
        {'user1': [1, 1, 1], 'user2': [2, 2, 2], 'user3': [3, 3, 3]})
Run Code Online (Sandbox Code Playgroud)

它使用长度为 3 的 adefaultdict作为list默认值。列表中每个元素的相关用户值都会更新。


Mih*_*nut 3

您可以使用 a 来执行此操作dictionary,以便按 分组列表项user

然后只需使用zip函数找出time, cpus, mem列表中每个特征的总和。

mylist = [['user1', 1, 6, 8], 
['user1', 2, 7, 9],
['user2', 3, 7, 5],
['user3', 4, 7, 3]]

dict = {}
for elem in mylist:
  if elem[0] not in dict:
    dict[elem[0]] = []
  dict[elem[0]].append(elem[1:])

for key in dict:
  dict[key] = [sum(i) for i in zip(*dict[key])]
Run Code Online (Sandbox Code Playgroud)

输出

In[1]: dict
Out[1]: {'user1': [3, 13, 17], 'user2': [3, 7, 5], 'user3': [4, 7, 3]}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您不应使用 `dict` 作为变量名,因为它是内置函数 https://docs.python.org/3/library/functions.html 。 (2认同)