如何使用Python根据部分值将字典拆分成几个字典

时间:2019-09-06 14:12:52

标签: 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':

但是我将如何找到整个初始的二元元素

5 个答案:

答案 0 :(得分:9)

从某种意义上说,我认为这是您想要做的。结果是一个主(“母”)字典,该字典具有所有可能的首字母作为键,并具有对应的字典作为值。

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)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

首先,您不应该将字典命名为“ dict”,因为这会与python的dict函数混淆。

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

以下是列表推导,可返回字典列表:

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

它不处理动态词典名称,但这似乎不是问题所在。

答案 3 :(得分:1)

import string
all_dict = {'sku1': 'k-1', 'sku2': 'k-2', 'sku3': 'b-10', 'sku4': 'b-1', 'sku5': 'x-1', 'sku6': 'x-2'}
alphabet_list = list(string.ascii_lowercase)
list_of_new_dict = []
for char in alphabet_list:
    temp_dict = dict()
    for key, value in all_dict.items():
        if value[0]==char:
            temp_dict[key] = value
    if temp_dict:
        list_of_new_dict.append(temp_dict)

出局:

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

答案 4 :(得分:1)

有一种使用itertools.groupby的简单方法,您可以按每个值的第一个字符(pair[1][0])进行分组。

方法:

from itertools import groupby
data = {'sku1': 'k-1', 'sku2': 'k-2', 'sku3': 'b-10', 'sku4': 'b-1', 'sku5': 'x-1', 'sku6': 'x-2'}
result = {key: dict(group) for key, group in groupby(data.items(), lambda pair: pair[1][0])}
print(result)

输出:

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