#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}