繁体   English   中英

Python 从字典中提取特定值

[英]Python extract specific values from dictionary

我有以下字典:

My_dict={'K0A1': 0.12, 'K1A1': 0.12, 'K2A1': 0.12, 'K3A1': 0.12, 'K0A2': 0.16, 'K1A2': 0.16, 'K2A2': 0.16, 'K3A2': 0.16, 'K0A3': 0.04, 'K1A3': 0.04, 'K2A3': 0.04, 'K3A3': 0.04, 'K0B1': 0.04, 'K1B1': 0.04, 'K2B1': 0.04, 'K3B1': 0.04, 'K0B2': 0.08, 'K1B2': 0.08, 'K2B2': 0.08, 'K3B2': 0.08, 'K0B3': 0.04, 'K1B3': 0.04, 'K2B3': 0.04, 'K3B3': 0.04, 'K0C1': 0.08, 'K1C1': 0.08, 'K2C1': 0.08, 'K3C1': 0.08, 'K0C2': 0.04, 'K1C2': 0.04, 'K2C2': 0.04, 'K3C2': 0.04, 'K0C3': 0.04, 'K1C3': 0.04, 'K2C3': 0.04, 'K3C3': 0.04, 'K0D1': 0.08, 'K1D1': 0.08, 'K2D1': 0.08, 'K3D1': 0.08, 'K0D2': 0.08, 'K1D2': 0.08, 'K2D2': 0.08, 'K3D2': 0.08, 'K0D3': 0.12, 'K1D3': 0.12, 'K2D3': 0.12, 'K3D3': 0.12}

我想在单独的列表中提取 K0A1、K0A2、K0A3 的值。 K0B1、K0B2、K0B3 等类似,直到最后。 我该怎么做? 任何人都可以请提出一个解决方案

如果您想通过键的第二个和第三个字符对所有子字典进行分组(如果逻辑不同,您实际上可以使用任何其他 function),您可以使用嵌套的defaultdict

from collections import defaultdict

d = defaultdict(lambda:defaultdict(dict))

for k,v in My_dict.items():
    d[k[1:3]][k] = v

out = {k: dict(v) for k,v in d.items()}

Output:

{'0A': {'K0A1': 0.12, 'K0A2': 0.16, 'K0A3': 0.04},
 '1A': {'K1A1': 0.12, 'K1A2': 0.16, 'K1A3': 0.04},
 '2A': {'K2A1': 0.12, 'K2A2': 0.16, 'K2A3': 0.04},
 '3A': {'K3A1': 0.12, 'K3A2': 0.16, 'K3A3': 0.04},
 '0B': {'K0B1': 0.04, 'K0B2': 0.08, 'K0B3': 0.04},
 '1B': {'K1B1': 0.04, 'K1B2': 0.08, 'K1B3': 0.04},
 '2B': {'K2B1': 0.04, 'K2B2': 0.08, 'K2B3': 0.04},
 '3B': {'K3B1': 0.04, 'K3B2': 0.08, 'K3B3': 0.04},
 '0C': {'K0C1': 0.08, 'K0C2': 0.04, 'K0C3': 0.04},
 '1C': {'K1C1': 0.08, 'K1C2': 0.04, 'K1C3': 0.04},
 '2C': {'K2C1': 0.08, 'K2C2': 0.04, 'K2C3': 0.04},
 '3C': {'K3C1': 0.08, 'K3C2': 0.04, 'K3C3': 0.04},
 '0D': {'K0D1': 0.08, 'K0D2': 0.08, 'K0D3': 0.12},
 '1D': {'K1D1': 0.08, 'K1D2': 0.08, 'K1D3': 0.12},
 '2D': {'K2D1': 0.08, 'K2D2': 0.08, 'K2D3': 0.12},
 '3D': {'K3D1': 0.08, 'K3D2': 0.08, 'K3D3': 0.12}}

要访问单个子组:

out['0A']
# {'K0A1': 0.12, 'K0A2': 0.16, 'K0A3': 0.04}
替代 output:
from collections import defaultdict

d = defaultdict(list)
for k,v in My_dict.items():
    d[k[:3]].append(v)

out=dict(d)

Output:

{'K0A': [0.12, 0.16, 0.04],
 'K1A': [0.12, 0.16, 0.04],
 'K2A': [0.12, 0.16, 0.04],
 'K3A': [0.12, 0.16, 0.04],
 'K0B': [0.04, 0.08, 0.04],
 'K1B': [0.04, 0.08, 0.04],
 'K2B': [0.04, 0.08, 0.04],
 'K3B': [0.04, 0.08, 0.04],
 'K0C': [0.08, 0.04, 0.04],
 'K1C': [0.08, 0.04, 0.04],
 'K2C': [0.08, 0.04, 0.04],
 'K3C': [0.08, 0.04, 0.04],
 'K0D': [0.08, 0.08, 0.12],
 'K1D': [0.08, 0.08, 0.12],
 'K2D': [0.08, 0.08, 0.12],
 'K3D': [0.08, 0.08, 0.12]}

如果我正确理解您的问题,您可以遍历密钥并存储您想要的密钥。 下面是一个例子:

My_dict={'K0A1': 0.12, 'K1A1': 0.12, 'K2A1': 0.12, 'K3A1': 0.12, 'K0A2': 0.16, 'K1A2': 0.16, 'K2A2': 0.16, 'K3A2': 0.16, 'K0A3': 0.04, 'K1A3': 0.04, 'K2A3': 0.04, 'K3A3': 0.04, 'K0B1': 0.04, 'K1B1': 0.04, 'K2B1': 0.04, 'K3B1': 0.04, 'K0B2': 0.08, 'K1B2': 0.08, 'K2B2': 0.08, 'K3B2': 0.08, 'K0B3': 0.04, 'K1B3': 0.04, 'K2B3': 0.04, 'K3B3': 0.04, 'K0C1': 0.08, 'K1C1': 0.08, 'K2C1': 0.08, 'K3C1': 0.08, 'K0C2': 0.04, 'K1C2': 0.04, 'K2C2': 0.04, 'K3C2': 0.04, 'K0C3': 0.04, 'K1C3': 0.04, 'K2C3': 0.04, 'K3C3': 0.04, 'K0D1': 0.08, 'K1D1': 0.08, 'K2D1': 0.08, 'K3D1': 0.08, 'K0D2': 0.08, 'K1D2': 0.08, 'K2D2': 0.08, 'K3D2': 0.08, 'K0D3': 0.12, 'K1D3': 0.12, 'K2D3': 0.12, 'K3D3': 0.12}

values = []

for myKey in list(My_dict.keys()):
    if myKey[0:2] == 'K0' and (myKey[3] == '1' or myKey[3] == '2' or myKey[3] == '3'):
        if myKey[3] == '1':
            values.append([My_dict[myKey]])
        else:
            values[-1].append(My_dict[myKey])

由于 3 个元素属于同一类别,您可以对字典的键进行排序并列出 3 个连续元素的值并将它们存储在结果字典中,就像这样......

from time import time

start = time()

Dict={'K0A1': 0.12, 'K1A1': 0.12, 'K2A1': 0.12, 'K3A1': 0.12, 'K0A2': 0.16, 'K1A2': 0.16, 'K2A2': 0.16, 'K3A2': 0.16, 'K0A3': 0.04, 'K1A3': 0.04, 'K2A3': 0.04, 'K3A3': 0.04, 'K0B1': 0.04, 'K1B1': 0.04, 'K2B1': 0.04, 'K3B1': 0.04, 'K0B2': 0.08, 'K1B2': 0.08, 'K2B2': 0.08, 'K3B2': 0.08, 'K0B3': 0.04, 'K1B3': 0.04, 'K2B3': 0.04, 'K3B3': 0.04, 'K0C1': 0.08, 'K1C1': 0.08, 'K2C1': 0.08, 'K3C1': 0.08, 'K0C2': 0.04, 'K1C2': 0.04, 'K2C2': 0.04, 'K3C2': 0.04, 'K0C3': 0.04, 'K1C3': 0.04, 'K2C3': 0.04, 'K3C3': 0.04, 'K0D1': 0.08, 'K1D1': 0.08, 'K2D1': 0.08, 'K3D1': 0.08, 'K0D2': 0.08, 'K1D2': 0.08, 'K2D2': 0.08, 'K3D2': 0.08, 'K0D3': 0.12, 'K1D3': 0.12, 'K2D3': 0.12, 'K3D3': 0.12}

sorted_keys = sorted(Dict)
res, ind = dict(), 0

while ind<len(Dict):
    temp = []

    for i in range(ind, ind+3):
        temp.append(Dict[sorted_keys[i]])
    else:
        res[sorted_keys[i][:3]] = temp
        ind += 3

print(res)

end = time()

print(f"\nTime Taken : {end-start}")

Output:-

{'K0A': [0.12, 0.16, 0.04], 'K0B': [0.04, 0.08, 0.04], 'K0C': [0.08, 0.04, 0.04], 'K0D': [0.08, 0.08, 0.12], 'K1A': [0.12, 0.16, 0.04], 'K1B': [0.04, 0.08, 0.04], 'K1C': [0.08, 0.04, 0.04], 'K1D': [0.08, 0.08, 0.12], 'K2A': [0.12, 0.16, 0.04], 'K2B': [0.04, 0.08, 0.04], 'K2C': [0.08, 0.04, 0.04], 'K2D': [0.08, 0.08, 0.12], 'K3A': [0.12, 0.16, 0.04], 'K3B': [0.04, 0.08, 0.04], 'K3C': [0.08, 0.04, 0.04], 'K3D': [0.08, 0.08, 0.12]}

Time Taken : 0.00011229515075683594

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM