как объединить два словаря на основе ключа, но включить отсутствующие значения ключа в python?

#python #dictionary

#python #словарь

Вопрос:

Как мы можем добиться приведенного ниже результата слияния, если у меня есть два словаря разной длины с похожими и непохожими ключами.

 left =  {key1: x1, key2: y1 , key3: z1 , key5 : n1}  
right = {key1: x2, key2: y2 , key4 : m1 ,key5 : n1}  
  

Результат :

 d =        { key1: {x1,x2},  
             key2: {y1,y2},
             key3: {z1,missing},
             key4 :{missing,m1}
             key5 :{n1,n1}
          }
  

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

1. Что вы пробовали, и в чем был недостаток?

2. «как с похожими, так и с разными ключами»: что это значит?

3. Ваш опубликованный код не является законным Python.

4. это работало в моем коде. sortedLeft = dict(sorted(left.items())) sortedRight = dict(sorted(right.items())) merged = {k : (sortedLeft[k],sortedRight[k]) для k в sortedLeft.keys() amp; sortedRight.keys()} sortedMerged = dict(сортировка (merged.items()))

5. В приведенном выше комментарии говорится, что этот словарь является законным. мой вопрос был в том, что я не могу достичь этой комбинации: key3: {z1, отсутствует}, key4: {отсутствует, m1}

Ответ №1:

Я использую квадратные скобки (списки) вместо фигурных (set), потому что кажется, что для вас важен порядок, а наборы не сохраняют порядок элементов.

  keys = set(left.keys()) | set(right.keys())
 d = {}
 for k in keys:
     d[k] = [left.get(k, 'missing'), right.get(k, 'missing')]
  

или немного короче с обозначением понимания

  keys = set(left.keys()) | set(right.keys())
 d = {k: [left.get(k, 'missing'), right.get(k, 'missing')] for k in keys}
  

Ответ №2:

Это то, что вы хотите?

 left =  {'key1': 'x1', 'key2': 'y1' , 'key3': 'z1' , 'key5' : 'n1'}  
right = {'key1': 'x2', 'key2': 'y2' , 'key4' : 'm1' ,'key5' : 'n1'}  
d=dict()

for key,val in left.items():
    d[key]=[val]
for key,val in right.items():
    if key in d.keys():
      d[key].append(val)
    else:
      d[key]=[val]

print(d)
>>>> {'key1': ['x1','x2'], 'key2': ['y1','y2'] , 'key3': ['z1'], 'key4':['m1'] , 'key5' : ['n1','n1']}  
  

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

1. Привет @emilaz Спасибо. можем ли мы сделать это так: key3: {z1, отсутствует}, key4: {отсутствует, m1}, потому что я хочу отслеживать, отсутствует ли значение в левом словаре или правом словаре. например, для key3: в правом словаре отсутствует значение.

2. В этом случае я бы согласился с ответом Сержа 🙂

3. Если определены все переменные, используемые при определении left и right , выходные данные будут сообщать их значения, а не имена переменных.

4. вы правы, но это был самый простой способ дать OP ответ, который он искал. Я обновлю свой пост, чтобы сделать его технически корректным. Спасибо за предупреждение.