将列表列表转换成可以转换为Json的字典

时间:2019-11-14 10:50:51

标签: python json dictionary

我有一个需要转换为字典或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
    }
}

做到这一点的最佳方法是什么?我当前的循环覆盖了密钥,如果用户已经存在,我需要它添加相应的属性。

谢谢!

5 个答案:

答案 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}}