我有一个需要转换为字典或json的Python列表列表,我的列表如下所示:
[
['user1', 'Administration', 100],
['user2', 'Development', 170],
['user2', 'Testing', 30],
['user3', 'Administration', 95],
['user3', 'Development', 400],
['user3', 'Testing', 200]
]
我需要这个看起来像这样:
{
"user1": {
"Administration": 100
},
"user2": {
"Development": 170,
"Testing": 30
},
"user3": {
"Administration": 95,
"Development": 400,
"Testing": 200
}
}
做到这一点的最佳方法是什么?我当前的循环覆盖了密钥,如果用户已经存在,我需要它添加相应的属性。
谢谢!
答案 0 :(得分:2)
使用dict.setdefault
例如:
data = [
['user1', 'Administration', 100],
['user2', 'Development', 170],
['user2', 'Testing', 30],
['user3', 'Administration', 95],
['user3', 'Development', 400],
['user3', 'Testing', 200]
]
result = {}
for k, sub_k, v in data:
result.setdefault(k, {}).update({sub_k: v})
输出:
{'user1': {'Administration': 100},
'user2': {'Development': 170, 'Testing': 30},
'user3': {'Administration': 95, 'Development': 400, 'Testing': 200}}
答案 1 :(得分:2)
使用collections.defaultdict
对象的简短方法:
from collections import defaultdict
# data (your initial list of lists)
d = defaultdict(dict)
for uname, k, v in data:
d[uname][k] = v
print(dict(d))
输出:
{'user1': {'Administration': 100},
'user2': {'Development': 170, 'Testing': 30},
'user3': {'Administration': 95, 'Development': 400, 'Testing': 200}}
答案 2 :(得分:0)
# import defaultdict to initialize by dictionary
from collections import defaultdict
# our data
ls = [
['user1', 'Administration', 100],
['user2', 'Development', 170],
['user2', 'Testing', 30],
['user3', 'Administration', 95],
['user3', 'Development', 400],
['user3', 'Testing', 200]
]
# create final response
d = defaultdict(dict)
# iterate and fill the result
for u, k, v in ls:
d[u][k] = v
# see if it's correct
print(d)
defaultdict(dict,
{'user1': {'Administration': 100},
'user2': {'Development': 170, 'Testing': 30},
'user3': {'Administration': 95, 'Development': 400, 'Testing': 200}})
答案 3 :(得分:0)
为便于理解
user_list = [
['user1', 'Administration', 100],
['user2', 'Development', 170],
['user2', 'Testing', 30],
['user3', 'Administration', 95],
['user3', 'Development', 400],
['user3', 'Testing', 200]
]
user_dict={}
for user in user_list:
user_dict[user[0]]={user[1]:user[2]}
print(user_dict)
输出:
{'user2': {'Testing': 30}, 'user3': {'Testing': 200}, 'user1': {'Administration': 100}}
答案 4 :(得分:0)
您也可以使用itertools.groupby
:
from itertools import groupby as gb
d = [['user1', 'Administration', 100], ['user2', 'Development', 170], ['user2', 'Testing', 30], ['user3', 'Administration', 95], ['user3', 'Development', 400], ['user3', 'Testing', 200]]
result = {a:{c:d for _, c, d in b} for a, b in gb(d, key=lambda x:x[0])}
输出:
{'user1': {'Administration': 100}, 'user2': {'Development': 170, 'Testing': 30}, 'user3': {'Administration': 95, 'Development': 400, 'Testing': 200}}