如何使用Python基于一部分值将字典拆分为多个字典

2024-10-02 12:27:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一本如下的字典

dict={'sku1':'k-1','sku2':'k-2','sku3':'b-10','sku4':'b-1','sku5':'x-1', 'sku6':'x-2'}

如何根据值的第一个字母获得单独的词典?比如:

dict1={'sku5':'x-1','sku6':'x-2'}
dict2={'sku1':'k-1','sku2':'k-2'}
dict2={'sku3':'b-10','sku4':'b-1'}

我从

for an_item in thevalues_ofdict:
    Splitted_Pcodes.append(int(an_item.split("-")[0]))
    for i in Splitted_Pcodes:
        if i=='x':

但我如何找到最初的决定性因素呢


Tags: inanfor字典itemdictdict2splitted
3条回答

首先,你不应该把你的字典命名为“dict”,因为那样会弄乱pythons的dict功能。你知道吗

my_dict = {'sku1':'k-1','sku2':'k-2','sku3':'b-10','sku4':'b-1','sku5':'x-1', 'sku6':'x-2'}

下面是一个列表理解,它返回一个dicts列表:

[{k:v for (k,v) in my_dict.items() if v[0] == start_val} for start_val in {val[0] for val in my_dict.values()}]

输出:

 [{'sku5': 'x-1', 'sku6': 'x-2'},
 {'sku3': 'b-10', 'sku4': 'b-1'},
 {'sku1': 'k-1', 'sku2': 'k-2'}]

它不处理动态字典名称,但这似乎不是问题的关键。你知道吗

from pprint import pprint

dict={'sku1':'k-1','sku2':'k-2','sku3':'b-10','sku4':'b-1','sku5':'x-1', 'sku6':'x-2'}

newdict = {}
for key, val in dict.items():
    v = val[0]
    if v not in newdict:
        newdict[v] = {}
    newdict[v][key] = val

pprint(newdict, indent=4)

输出:

{   'b': {'sku3': 'b-10', 'sku4': 'b-1'},
    'k': {'sku1': 'k-1', 'sku2': 'k-2'},
    'x': {'sku5': 'x-1', 'sku6': 'x-2'}}

从某种意义上说,我想这就是你想做的。结果是一个主(“母”)字典,它将所有可能的第一个字母作为键,并将相应的dict作为值。你知道吗

from collections import defaultdict
d = {'sku1': 'k-1','sku2': 'k-2','sku3': 'b-10' ,'sku4': 'b-1', 'sku5': 'x-1', 'sku6':'x-2'}

mother = defaultdict(dict)
for key, val in d.items():
    mother[val[0]][key] = val

mother = dict(mother)
print(mother)

输出:

{'k': {'sku1': 'k-1', 'sku2': 'k-2'},
 'b': {'sku3': 'b-10', 'sku4': 'b-1'},
 'x': {'sku5': 'x-1', 'sku6': 'x-2'}}

然后你就可以像这样轻松地访问它们。你知道吗

k_dict = mother['k']
b_dict = mother['b']
x_dict = mother['x']

如果您想要更多的控制,并希望能够给出密钥的大小,我们可以这样做:

from collections import defaultdict


def split_d(d, key_size=1):
    if key_size < 1:
        raise ValueError("'key_size' must be 1 or more")

    mother = defaultdict(dict)
    for key, val in d.items():
        mother[val[0:key_size]][key] = val

    return dict(mother)

if __name__ == '__main__':
    d = {'sku1': 'k-1','sku2': 'k-2','sku3': 'b-10' ,'sku4': 'b-1', 'sku5': 'x-1', 'sku6':'x-2'}

    res = split_d(d, 3)
    print(res)

相关问题 更多 >

    热门问题