根据项目字典中的键对python字典进行分组

2024-09-28 17:01:56 发布

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

我是python新手,我也是;尝试按键对现有python字典进行分组。 我有一本这样的字典

a = {'a1':'obj_1','b1':'obj_2','c1':'obj_3','a2':'obj_4','b2':'obj_5','c2':'obj_6'}

我想创建另一个字典,将所有项目分组,以“a”、“b”、“c”开头,如下所示:

{'aonly': {'a1': 'obj_1','a2': 'obj_4'}, 'bonly': {'b1': 'obj_2','b2': 'obj_5'}, 'conly': {'c1': 'obj_3','c2': 'obj_6'}}

我尝试的解决方案是:

    d = {}
    for k,v in a.items():
    print(k)
    print(v)
    if 'a' in k:
        d.setdefault('a',{k:v})
    elif 'b' in k:
        d.setdefault('b',{k:v})
    elif 'c' in k:
        d.setdefault('c',{k:v})
print(d)

但这并不能提供正确的输出

我尝试的另一个解决方案是

l= []
m = []
n = []

d = {}
for i in a:

    if 'a' in i:
        l.append({i:a[i]})
        d['aonly'] = l
    elif 'b' in i:
        m.append({i:a[i]})
        d['bonly'] = m
    elif 'c' in i:
        n.append({i:a[i]})
        d['conly']  = n
print(d)

这类服务于我的目的,但由于使用列表等而无效。是否有更好的方法解决此问题

另外,在第二段代码中, 为什么一行作业会产生奇怪的结果

l = m = n = []

请告知

我从collections模式中通读了defaultDict,但对我的要求没有太大的混淆。有人能帮我吗


Tags: inobja2字典a1b2b1print
2条回答

在发布问题后,我尝试了这个方法,目的是为了。但我喜欢使用defaultdict的解决方案,而且执行速度也相当快

d = {}
for k,v in a.items():
    if 'a' in k:
        d.setdefault('a',{})
        d['a'][k] = v
    elif 'b' in k:
        d.setdefault('b',{})
        d['b'][k] = v
    elif 'c' in k:
        d.setdefault('c',{})
        d['c'][k] = v
print(d)

使用collections.defaultdict

from collections import defaultdict
d_dict = defaultdict(dict)

for i in {k[0] for k in a}:
    d_dict[i + 'only'] = {k:v for k,v in a.items() if k[0]==i}

print (dict(d_dict))
#{'conly': {'c1': 'obj_3', 'c2': 'obj_6'}, 'aonly': {'a1': 'obj_1', 'a2': 'obj_4'}, 'bonly': {'b1': 'obj_2', 'b2': 'obj_5'}}

相关问题 更多 >