#python #dictionary #nested #duplicates
#python #словарь #вложенный #дубликаты
Вопрос:
Я довольно новичок в Python, и у меня следующая проблема. У меня есть вложенный словарь в виде
dict = {'a': {'1','2'}, 'b':{'5','1'}, 'c':{'3','2'}}
и хотел бы найти все ключи, которые имеют одинаковые значения. Результат должен выглядеть примерно так.
1 : [a,b]
2 : [a,c]
..
Заранее большое спасибо за любую помощь!
Ответ №1:
dict = {'a': {'1','2'}, 'b':{'5','1'}, 'c':{'3','2'}}
output = {}
for key, value in dict.items():
for v in value:
if v in output.keys():
output[v].append(key)
else:
output[v] = [ key ]
print(output)
И результат будет
{'2': ['a', 'c'], '1': ['a', 'b'], '5': ['b'], '3': ['c']}
Ответ №2:
прежде чем мы перейдем к решению, позвольте мне сказать вам кое-что. То, что у вас есть, — это не вложенный словарь, а скорее наборы внутри словаря.
Некоторые термины python, чтобы прояснить это:
-
Массив: [ 1, 2]
Массивы заключены в квадратные скобки и разделены запятыми.
-
Словарь: { «a»: 1, «b»: 2}
Словари заключены в фигурные скобки и разделяют пары «ключ»: значение запятой. Здесь «a» и «b» — это ключи, а 1 и 2 будут их соответствующими значениями.
-
Набор: { 1, 2}
Наборы заключены в фигурные скобки и разделены запятыми.
dict = {‘a’: {‘1′,’2’}, ‘ b’:{‘5′,’1’}, ‘ c’:{‘3′,’2’}}
Здесь, {‘1’, ‘2’} представляет собой набор в словаре с ключом ‘a’. Таким образом, то, что у вас есть, на самом деле задано в словаре, а не во вложенном словаре.
Решение
Переходя к решению, наборы не являются итеративными, что означает, что вы не можете просматривать их один за другим. Итак, вы должны превратить их в списки, а затем повторить их.
# Initialize the dictionary to be processed
data = {'a': {'1','2'}, 'b':{'5','1'}, 'c':{'3','2'}}
# Create dictionary to store solution
sol = {} # dictionary to store element as a key amp; sets containing that element as an array
# Eg., sol = { "1" : [ "a" , "b" ] }
# This shows that the value 1 is present in the sets contained in keys a amp; b.
# Record all elements amp; list every set containing those elements
for key in data. keys (): # iterate all keys in the dictionary
l = list ( data [ key ] ) # convert set to list
for elem in l: # iterate every element in the list
if elem in sol. keys (): # check if elem already exists in solution as a key
sol [ elem ]. append ( key ) # record that key contains elem
else:
sol [ elem ] = [ key ] # create a new list with elem as key amp; store that key contains elem
# At this time, sol would be
# {
# "1" : [ "a" , "b" ] ,
# "2" : [ "a" , "C" ] ,
# "3" : [ "c" ] ,
# "5" : [ "b" ]
# }
# Since, you want only the ones that are present in more than 1 sets, let's remove them
for key in sol : # iterate all keys in sol
if sol [ key ]. length < 2 : # Only keys in at least 2 sets will be retained
del sol [ key ] # remove the unrequired element
# Now, you have your required output in sol
print ( sol )
# Prints:
# {
# "1" : [ "a" , "b" ] ,
# "2" : [ "a" , "c" ]
# }
Я надеюсь, что это вам поможет…
Ответ №3:
Вы можете использовать defaultdict
для простого построения выходных данных (и отсортировать их, если хотите, чтобы ключи располагались в отсортированном порядке):
from collections import defaultdict
d = {'a': {'1','2'}, 'b':{'5','1'}, 'c':{'3','2'}}
out = defaultdict(list)
for key, values in d.items():
for value in values:
out[value].append(key)
# for a sorted output (dicts are ordered since Python 3.7):
sorted_out = dict((k, out[k]) for k in sorted(out))
print(sorted_out)
#{'1': ['a', 'b'], '2': ['a', 'c'], '3': ['c'], '5': ['b']}
Ответ №4:
вы можете изменить ключ-значение в dict, создать ключ-значение dict, если вам нужны только дублированные значения ( find all the keys that have the same values
), вы можете filter
это:
from collections import defaultdict
def get_duplicates(dict1):
dict2 = defaultdict(list)
for k, v in dict1.items():
for c in v:
dict2[c].append(k)
# if you want to all values, just return dict2
# return dict2
return dict(filter(lambda x: len(x[1]) > 1, dict2.items()))
вывод:
{'1': ['a', 'b'], '2': ['a', 'c']}
Ответ №5:
Это можно легко сделать, используя defaultdict
from collections
,
>>> d = {'a': {'1','2'}, 'b':{'5','1'}, 'c':{'3','2'}}
>>> from collections import defaultdict
>>> dd = defaultdict(list)
>>> for key,vals in d.items():
... for val in vals:
... dd[val].append(key)
...
>>>>>> dict(dd)
{'1': ['a', 'b'], '3': ['c'], '2': ['a', 'c'], '5': ['b']}
Ответ №6:
Этого можно легко достичь с помощью двух внутренних циклов for:
dict = {'a': {'1','2'}, 'b':{'5','1'}, 'c':{'3','2'}}
out = {}
for key in dict:
for value in dict[key]:
if value not in out:
out[value]= [key]
else:
out[value] = [key]
print out # {'1': ['a', 'b'], '3': ['c'], '2': ['a', 'c'], '5': ['b']}