Python 如何将此目录列表转换为新目录

Python 如何将此目录列表转换为新目录,python,python-3.x,Python,Python 3.x,我想把这张单子转换成: input_list = [ {'a': 5,'b': 7}, {'a': 3,'b': 4}, ] 为此: result_dict = { 'a': [5, 3], 'b': [7, 4] } 我怎么也做不到 有人能帮帮我吗 result_dict = {} for index, row_dict in enumerate(input_list): for key, item_dict in row_dict.items():

我想把这张单子转换成:

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

result_dict = {
    'a': [5, 3],
    'b': [7, 4]
}
我怎么也做不到

有人能帮帮我吗

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])
嗯,我想是这样的。也许有人会想出更好的办法


嗯,我想是这样的。也许有人会想出一个更好的方法。

所以这里有一些东西可能会对你有所帮助

它使用了
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)

所以这里有一些东西可能会对你有所帮助

它使用了
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)
一种普通的Python方法 在这里,我们迭代这些项,并在
结果
dict中添加一个空列表,以防该键尚未在字典中。不管是否已经有一个列表,我们都会将
v
附加到该列表中

使用
defaultdict
我们可以使用
collections
中的
defaultdict
使其更加优雅:

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
如果每个字典包含相同的键,我们可以使用熊猫:

from pandas import DataFrame

result = DataFrame(data).to_dict(orient='list')
一种普通的Python方法 在这里,我们迭代这些项,并在
结果
dict中添加一个空列表,以防该键尚未在字典中。不管是否已经有一个列表,我们都会将
v
附加到该列表中

使用
defaultdict
我们可以使用
collections
中的
defaultdict
使其更加优雅:

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
如果每个字典包含相同的键,我们可以使用熊猫:

from pandas import DataFrame

result = DataFrame(data).to_dict(orient='list')
一班轮

{y[0][0]: list(zip(*y)[1]) for y in zip(*[x.items() for x in input_list])}
有点冒险,我们严重依赖
.items()
每次按相同顺序返回密钥

一个班轮

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

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

稍微详细一点的解决方案,但这也适用于:

from itertools import groupby
from itertools import chain
from operator import itemgetter

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

all_lsts = sorted(chain.from_iterable(d.items() for d in input_list))

group = dict((k, list(map(itemgetter(1), g))) for _, g in groupby(all_lsts, key=itemgetter(0)))

print(group)
# {'a': [3, 5], 'b': [4, 7]}

一个稍微详细一点的解决方案,但它也可以工作:

from itertools import groupby
from itertools import chain
from operator import itemgetter

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

all_lsts = sorted(chain.from_iterable(d.items() for d in input_list))

group = dict((k, list(map(itemgetter(1), g))) for _, g in groupby(all_lsts, key=itemgetter(0)))

print(group)
# {'a': [3, 5], 'b': [4, 7]}

你自己尝试了什么?你应该
groupBy
key。此外,这个问题没有明确说明。如果没有一个键出现在每本字典中怎么办?熊猫对你有用吗?@WillemVanOnsem发布了我的解决方案,谢谢你的帮助。你自己尝试了什么?你应该
groupBy
key。此外,这个问题还没有明确说明。如果每本字典中都没有出现一个键怎么办?熊猫对你有用吗?@WillemVanOnsem发布了我的解决方案,谢谢你帮我把你认出来,Willem!这3个片段都很有魅力。有这么多更好、更干净的方法可以做到这一点,这给我留下了深刻的印象。为此,我一定很喜欢python(这个命令非常有用)。@ThinkTeam:是的,python提供了一些灵活性,可以非常优雅地定义大多数问题:)谢谢Willem!这3个片段都很有魅力。有这么多更好、更干净的方法可以做到这一点,这给我留下了深刻的印象。为此,我一定很喜欢python(这个命令非常有用)。@ThinkTeam:是的,python提供了一些灵活性,可以非常优雅地定义大多数问题:)