我有一本类似以下的字典
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':
但是我将如何找到整个初始的二元元素
答案 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'}}