#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 ответ, который он искал. Я обновлю свой пост, чтобы сделать его технически корректным. Спасибо за предупреждение.