группировка python словарей по ключам из словаря предметов - PullRequest
0 голосов
/ 29 апреля 2020

Я новичок в 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)

Этот вид служит моей цели, но неэффективен из-за использования list et c. Есть ли лучший способ решить эту проблему?

также, во втором фрагменте кода, почему присвоение в одной строке дает странный результат?

l = m = n = []

, пожалуйста, сообщите.

Я вроде прочитал defaultDict из режима коллекций, но немного запутался с моим требованием. Может кто-нибудь помочь мне с этим пожалуйста?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

После публикации вопроса я попробовал это, и это служит цели. Но мне нравится решение с использованием 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)
0 голосов
/ 29 апреля 2020

Использование 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'}}
...