我有一个看起来像这样的列表:
['user1', time, cpus, mem]
['user1', time, cpus, mem]
['user2', time, cpus, mem]
['user3', time, cpus, mem]
Run Code Online (Sandbox Code Playgroud)
等等..
我只需要每个用户一个列表,将时间、CPU 和内存加在一起。我已经尝试了一些东西,但我不能让它工作。
一种甜蜜、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默认值。列表中每个元素的相关用户值都会更新。
您可以使用 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)