Как разделить словарь на основе сходства значений на два отдельных словаря

#python #dictionary

Вопрос:

У меня есть dict :

 dictionary =  {'1': 'a',
     '2': 'a',
     '3': 'b',
     '4': 'b'}
 

и я хочу разделить его так, чтобы в одном dict содержались все элементы с value == 'a' , а в другом-все элементы с value == 'b' :

 dict_a = {'1': 'a',
     '2': 'a'}

dict_b = {'3': 'b',
     '4': 'b'}
 

Как я могу сделать это коротким способом?
Мой подход

 dict_a = {}
dict_b = {}
for key, value in dictionary.items():
     if value == 'a':
         dict_a = dict(key, value)
     else:
         dict_b = dict(key, value)
 

не работает.

Ответ №1:

Попробуйте это вместо этого:

 dict_a={}
dict_b={}
for key, value in dictionary.items():
    if value == 'a':
        dict_a[key] = value
    else:
        dict_b[key] = value
 

В исходном коде вы создавали заново dict_a или dict_b каждый раз, когда проходили цикл.

Если вы не совсем уверены, что ваш начальный дикт содержит ТОЛЬКО "a" "b" значения или, используйте это вместо этого:

 dict_a={}
dict_b={}
for key, value in dictionary.items():
    if value == 'a':
        dict_a[key] = value
    elif value == 'b':
        dict_b[key] = value
    else:
        pass
 

Комментарии:

1. Большое спасибо

Ответ №2:

Вы также можете использовать filter() , если хотите более короткое решение:

 dict_a = dict(filter(lambda kv: kv[1] == 'a', dictionary.items()))
dict_b = dict(filter(lambda kv: kv[1] == 'b', dictionary.items()))
 

Обратите внимание, что это может быть медленнее, чем ручной for цикл, если вам придется делать это более одного раза.

В любом случае, если вы уже знаете, что каждое отдельное значение в dict_a будет "a" и каждое отдельное значение в dict_b будет "b" , это кажется пустой тратой места, вам вообще не нужны словари:

 keys_a = []
keys_b = []

for key, value in dictionary.items():
    if key == 'a':
        keys_a.append(key)
    else:
        keys_b.append(key)
 

Или с filter() :

 keys_a = list(filter(lambda k: dictionary[k] == 'a', dictionary.keys()))
keys_b = list(filter(lambda k: dictionary[k] == 'b', dictionary.keys()))
 

Ответ №3:

Если значения в вашем исходном dict файле не находятся под вашим контролем или не ограничены a и b , вы можете попробовать выполнить следующие действия:

 def combine_similar_values(input_dict):
    output = {}
    distinct_values = set()
    for k, v in input_dict.items():
        v_str = str(v)
        if v_str in distinct_values:
            output[v_str][k] = v
        else:
            distinct_values.add(v_str)
            output[v_str] = {k: v}
    return output.values()
 

combine_similar_values вернет список словарей, каждый dict из которых содержит одинаковые значения.