我正在使用Python3.6。
有一个python字典
my_dict = {"AUG": {"AA": 10, "BB": 55},
"SEPT": {"AA": 11, "BB": 56},
"OCT": {"AA": 12, "BB": 57},
"NOV": {"AA": 13, "BB": 58},
"DEC": {"AA": 14, "BB": 59}
}
获取“ AA”和“ BB”的所有值并放入列表中。
如何以优化的方式将my_dict词典转换为这种格式?
new_dict = {"AA": [10, 11, 12, 13, 14], "BB": [55, 56, 57, 58, 59]}
我正在使用它进行转换,但是我的数据很大并且转换速度很慢:
new_dict = {}
for month, data in my_dict.items():
for key, value in data.items():
new_dict.setdefault(key, [])
new_dict[key].append(value)
print(new_dict)
答案 0 :(得分:3)
我正在使用它进行转换,但是我的数据很大并且转换速度很慢
以下是一些速度测试,可帮助您对不同方法进行基准测试:
首先,我将创建一个随机字典,其中包含1000个external_keys和所有2个大写字符,用于具有随机整数值的内键。
import pandas as pd
import numpy as np
import string
from itertools import combinations, chain, groupby
from collections import defaultdict
from operator import itemgetter
np.random.seed(0)
N = 1000
outer_keys = ["".join(x) for x in np.random.choice(list(string.ascii_uppercase), (N, 3))]
outer_keys = list(set(outer_keys))
inner_keys = ["".join(x) for x in combinations(string.ascii_uppercase, 2)]
my_dict = {
outer_key: {
inner_key: np.random.randint(0, 100)
for inner_key in inner_keys
}
for outer_key in outer_keys
}
%%timeit
new_dict_op = {}
for month, data in my_dict.items():
for key, value in data.items():
new_dict_op.setdefault(key, [])
new_dict_op[key].append(value)
# 10 loops, best of 3: 89.7 ms per loop
collections.defaultdict
%%timeit
new_dict_dd = defaultdict(list)
for d in my_dict.values():
for k, v in d.items():
new_dict_dd[k].append(v)
#10 loops, best of 3: 48.3 ms per loop
sorted
(缓慢)和itertools.groupby
%%timeit
new_dict_oneliner = {
k: list(map(itemgetter(1), g))
for k, g in groupby(
sorted(
chain.from_iterable(map(dict.items, my_dict.values()))
),
itemgetter(0)
)
}
# 1 loop, best of 3: 514 ms per loop
%%timeit
new_dict_pandas = pd.DataFrame(my_dict.values()).to_dict(orient='list')
# 10 loops, best of 3: 139 ms per loop
df = pd.DataFrame(my_dict.values())
%%timeit
new_dict_pandas_2 = df.to_dict(orient='list')
# 100 loops, best of 3: 7.99 ms per loop
因此,使用pandas
的速度似乎比原始方法快10倍,而忽略了转换为DataFrame的前期成本。如果没有DataFrame,则使用defaultdict
的速度快2倍。
答案 1 :(得分:1)
这很简单,但是我仍然很失望,您没有包括自己的编码尝试。 (直到15分钟后编辑您的帖子...)
my_dict = {"AUG": {"AA": 10, "BB": 55},
"SEPT": {"AA": 11, "BB": 56},
"OCT": {"AA": 12, "BB": 57},
"NOV": {"AA": 13, "BB": 58},
"DEC": {"AA": 14, "BB": 59}
}
new_dict = {"AA": [], "BB": []}
for item in my_dict.values():
for key in new_dict:
new_dict[key].append(item[key])
print(new_dict)
请问您:
{'AA':[11、10、13、12、14],'BB':[56、55、58、57、59]}
很显然,每次字典的输出都会有所不同。如果存在问题,则需要改为实施OrderedDict()
。
注意:您可能还可以将其压缩为一行列表/词典理解
答案 2 :(得分:0)
这很容易理解
result = {k:[d[k] for d in my_dict.values()] for k in ("AA","BB")}
# {'AA': [10, 11, 12, 13, 14], 'BB': [55, 56, 57, 58, 59]}