列出的Python字典值

时间:2019-05-24 16:01:29

标签: python python-3.x

我正在使用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)

3 个答案:

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

方法1:OP的解决方案

%%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

方法2: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

方法3:使用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

方法4:熊猫

%%timeit
new_dict_pandas = pd.DataFrame(my_dict.values()).to_dict(orient='list')
# 10 loops, best of 3: 139 ms per loop

方法5:假设您已经拥有DataFrame的熊猫

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]}