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提供了一些灵活性,可以非常优雅地定义大多数问题:)