Skip to main content
 首页 » 编程设计

python之根据现有词典制作词典列表

2025年05月04日23落叶

编写了一个脚本来获取每个用户在 AWS 上运行的实例列表。我有一个字典列表。我想排序并列出每个用户运行的实例数(list_instances)。

list_instances=[{'type': u't2.small', 'user': u'user1'}, 
     {'type': u'm4.large', 'user': u'user1'}, 
     {'type': u't2.medium', 'user': u'user1'}, 
     {'type': u't2.small', 'user': u'user1'}, 
     {'type': u'm4.large', 'user': u'user1'}, 
     {'type': u't2.small', 'user': u'user1'}, 
     {'type': u'm4.large', 'user': u'user2'}, 
     {'type': u'm4.large', 'user': u'user3'}, 
     {'type': u't2.medium', 'user': u'user2'}, 
     {'type': u't2.medium', 'user': u'user2'}, 
     {'type': u't2.small', 'user': u'user3'}] 

创建了包含用户名和实例类型的两个列表。

names_list=[u'user1', u'user2', u'ben', u'user3', u'user4'] 
 
type_list=[u't2.small', u'm4.large', u'm4.large', u't2.medium', u't2.small', u'm4.large', u'm4.large', u't2.small'] 

尝试:

val = 0 
final_instances=[] 
for ii in names_list: 
    temp_dic = {} 
    for jj in type_list: 
        for kk in list_instances: 
            if (ii == kk['user']) and (jj in kk): 
                #print ii,kk['user'],jj,kk,kk[jj] 
                temp_dic['user']=kk['user'] 
                temp_dic[jj]=val+kk[jj] 
                final_a.append(temp_dic) 
print (final_instances) 

我没有得到如下所示的预期输出。我的逻辑无法有效获得预期结果。有人可以帮我解决这个问题吗?提前致谢!

目标: final_instances= [{'user':u'user1','t2.small':'3','m4.large':'2','t2.medium':'1'} {'user': u'user2','m4.large': '1','t2.medium': '2'} {'user': u'user3','2.small': '1','m4.large': '1'}]

请您参考如下方法:

您可以使用 collections.Counter在按用户分组您的原始字典列表后进行计数:

from collections import Counter 
from operator import itemgetter 
from itertools import groupby 
from pprint import pprint 
 
f = itemgetter('user') 
lst = [] 
for k, g in groupby(sorted(list_instances, key=f), f): 
    c = Counter({u'user': k}) 
    c.update([d['type'] for d in g]) 
    lst.append(dict(c)) 
 
pprint(lst) 

[{u'm4.large': 2, u't2.medium': 1, u't2.small': 3, u'user': u'user1'}, 
 {u'm4.large': 1, u't2.medium': 2, u'user': u'user2'}, 
 {u'm4.large': 1, u't2.small': 1, u'user': u'user3'}] 

如果您希望计数以字符串形式结束,您可以使用字典理解在追加到列表之前在计数器中转换值。

... 
d = {k: str(v) for k, v in c.items()} 
lst.append(d)