Найти наименьший набор после слияния ключа с пустым списком из одного словаря с другим словарем, содержащим этот ключ в качестве значения

#python #python-3.x #dictionary

#python #python-3.x #словарь

Вопрос:

У меня есть два словаря в Python 3-x.:

 A = {1: [9], 7: [], 14: [], 32: [9], 40: []}
 

и

 B = {1: [7, 9, 10], 7: [1, 14], 14: [7, 40], 32: [9, 40], 40: [14, 32]}
 

Я хочу найти для этих пустых списков в качестве значений в dict A ключ, содержащийся в виде значений в dict B. Затем объедините этот ключ из dict A в список значений, содержащий ключ из A, и выведите кратчайший набор комбинированного слияния ключа и значения.

Например, ключ 7 в dict A имеет пустой список в качестве значения. Итак, мы смотрим, какие списки значений в B содержат ключ 7. Мы видим, что 1: [7, 9, 10] и 14: [7, 40] содержат «7» в качестве значения. Итак, выполните слияние для вывода наборов: {1, 7, 9, 10} и {14, 40, 7}. Из этих двух наборов конечным результатом должен быть наименьший набор, т.Е. {14, 40, 7} . Примечание: если оба набора имеют одинаковый размер, я хотел бы выбрать первый. То же самое относится к ключам 14 и 40 в dict A.

До сих пор я пробовал следующее:

 temp3 = []
for k, v in A.items():
 if len(v) == 0:
       s3 = set()
       for i,j in B.items():
           if k in j:
               lst = []
               lst.append(j)
               min_list = min(lst)
               s3 = set(min_list)
               s3.add(k)
               s3.add(i)
               temp3.append(s3)
               C = set()
               for i in temp3:
                   C = set(i)
               print("temp3 for", k, "is", C)
 

Вывод:

 temp3 for 7 is {9, 1, 7, 10}
temp3 for 7 is {40, 14, 7}
temp3 for 14 is {1, 14, 7}
temp3 for 14 is {32, 40, 14}
temp3 for 40 is {40, 14, 7}
temp3 for 40 is {40, 9, 32}
 

Я могу выполнить слияния. Но я не могу понять, как получить наименьший набор в качестве вывода, как описано выше. Пожалуйста, помогите.

Ответ №1:

Проще, если вы используете итерацию наборов кандидатов и используете min ее:

 for a in A:
    if not A[a]:
        sets = ({b, *B[b]} for b in B if a in B[b])
        print(a, min(sets, key=len))
 

Вывод:

 7 {40, 14, 7}
14 {1, 14, 7}
40 {40, 14, 7}