#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
из которых содержит одинаковые значения.