【问题标题】:Python extract specific values from dictionaryPython从字典中提取特定值
【发布时间】:2022-01-25 16:53:15
【问题描述】:

我有以下字典:

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 等类似,直到最后。我该怎么做?任何人都可以提出一个解决方案

【问题讨论】:

  • 嗯...My_dict["K0A1"]?
  • 只有K0A1、K0A2、K0A3等,还是K1A1、K2A1等在同一个列表中?
  • 我想在同一个字典中创建另一个字典,将上述键模式分组@E.Klahn

标签: python python-3.x


【解决方案1】:

如果您想通过键的第二个和第三个字符对所有子字典进行分组(如果逻辑不同,您实际上可以使用任何其他功能),您可以使用嵌套的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()}

输出:

{'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}
替代输出
from collections import defaultdict

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

out=dict(d)

输出:

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

【讨论】:

  • 谢谢@mozway。您的解决方案非常适合我想要的输出。
  • @Libin 你能解释一下你为什么选择this answer吗?它需要排序,这使得它几乎总是效率较低。如果这是因为输出,您可以修改我的方法以使用 d = defaultdict(list)d[k[1:3]].append(v)(请参阅编辑)
  • 我已选择您的建议作为对我有帮助的答案
  • 抱歉!我现在检查了。那是偶然的。非常感谢您指出并非常感谢您的帮助
  • @LibinThomas 如果你选择了它就很好,我只是想知道为什么;)
【解决方案2】:

由于 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}")

输出:-

{'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

【讨论】:

  • 非常感谢您的快速建议。真的很感激。显然@mozway 的建议最适合我的要求
  • 罗杰,不客气
【解决方案3】:

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

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

【讨论】:

  • 我假设您只想要 K0_1、K0_2、K0_3,但如果您想要其他东西,很容易修改。
猜你喜欢
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
相关资源
最近更新 更多