如何将这个dicts列表转换为新的dict

时间:2018-02-13 18:52:07

标签: python python-3.x

我想转换这个词典列表:

input_list = [
    {'a': 5,'b': 7},
    {'a': 3,'b': 4},
]

到此:

result_dict = {
    'a': [5, 3],
    'b': [7, 4]
}

我不知道怎么能设法做到这一点。

请有人帮助我。

6 个答案:

答案 0 :(得分:6)

vanilla Python方法

result = {}
for subdic in data:
    for k, v in subdic.items():
        result.setdefault(k, []).append(v)

这里我们迭代这些项目,我们在result dict中添加一个空列表,以防密钥尚未出现在字典中。无论是否已有列表,我们都会将v附加到该列表中。

使用defaultdict

我们可以使用defaultdict中的collections

使其更加优雅
from collections import defaultdict

result = defaultdict(list)
for subdic in data:
    for k, v in subdic.items():
        result[k].append(v)

这里我们基本上对setdefault进行抽象(我们还节省了构建无用的空列表)。如果输出应该是dict(而不是defaultdict),我们可以使用以下函数结束函数:

result = dict(result)

使用pandas

如果每个字典包含相同的键,我们可以使用pandas:

from pandas import DataFrame

result = DataFrame(data).to_dict(orient='list')

答案 1 :(得分:2)

result_dict = {}
for index, row_dict in enumerate(input_list):
    for key, item_dict in row_dict.items():
        if not key in result_dict:
            result_dict[key] = []

        result_dict[key].append(row_dict[key])
嗯,我认为这样做了。也许有人提出了更好的方法..

答案 2 :(得分:2)

所以这里有可能对你有所帮助。

它使用defaultdict构造,这可能是一种矫枉过正,但它可以干净地解决任务。

from collections import defaultdict

input_list = [
    {'a': 5, 'b': 7},
    {'a': 3, 'b': 4},
]

result_dict = defaultdict(list)

for i, j in zip(*[i.items() for i in input_list]):
    result_dict[i[0]].append(i[1])
    result_dict[j[0]].append(j[1])

print dict(result_dict)

答案 3 :(得分:2)

In [1]: input_list = [
   ...:     {'a': 5,'b': 7},
   ...:     {'a': 3,'b': 4},
   ...: ]

In [2]: result_dict = {}

In [3]: for d in input_list:
   ...:     for k, v in d.items():
   ...:         if k not in result_dict:
   ...:             result_dict[k] = [v]
   ...:         else:
   ...:             result_dict[k].append(v)
   ...:             

In [4]: result_dict
Out[4]: {'a': [5, 3], 'b': [7, 4]}

答案 4 :(得分:1)

一衬垫

{y[0][0]: list(zip(*y)[1]) for y in zip(*[x.items() for x in input_list])}

有点冒险,我们每次都严重依赖.items()以相同的顺序返回密钥。

答案 5 :(得分:0)

稍微详细的解决方案,但这也有效:

    Map<String, String> m = Stream.of("1", "2", "3")
//          .map(StreamTuple::create)
            .map(id -> new StreamTuple<>(id, id))
            .collect(toMap(StreamTuple::left, StreamTuple::right));