Объединить два defaultdict со специальным символом для несовпадающих ключей - PullRequest
0 голосов
/ 30 января 2019

У меня есть два defaultdict, как упомянуто ниже:

L1 = [(10955, 'AB'), (10954, 'AB'), (10953, 'ABC'), (10952, 'ABCD'),(10951, 'ABCDEF')]
L2 = [(10956, 'A'), (10955, 'A'), (10954, 'ABE'), (10953, 'ABC'), (10952, 'ABCD')]

Я хочу объединить оба defaultdict и заполнить несовпадающий ключ с помощью # #

RES = [(10956, '#', 'A'),(10955, 'AB', 'A'), (10954, 'AB', 'ABE'), (10953, 'ABC', 'ABC'), (10952, 'ABCD', 'ABCD'),(10951, 'ABCDEF', '#')]
.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Вы можете использовать панд:

import pandas as pd
d1 = pd.DataFrame().from_dict(dict(L1), orient='index')

d2 = pd.DataFrame().from_dict(dict(L2), orient='index')

pd.concat([d1,d2], axis=1).fillna('#').reset_index().apply(tuple, axis=1).tolist()

Вывод:

[(10951, 'ABCDEF', '#'), (10952, 'ABCD', 'ABCD'), (10953, 'ABC', 'ABC'), (10954, 'AB', 'ABE'), (10955, 'AB', 'A'), (10956, '#', 'A')]
0 голосов
/ 30 января 2019

просто перебрать отсортированные ключи, и если ключ не присутствует ни в одном из диктов, то установить значение по умолчанию как '#'

from collections import OrderedDict
L1 = [(10955, 'AB'), (10954, 'AB'), (10953, 'ABC'), (10952, 'ABCD'),(10951, 'ABCDEF')]
L2 = [(10956, 'A'), (10955, 'A'), (10954, 'ABE'), (10953, 'ABC'), (10952, 'ABCD')]

L1=OrderedDict(L1)
L2=OrderedDict(L2)

sorted_keys=sorted(set(L1.keys()+L2.keys()),reverse=True) #sorting the keys in reverse

d=OrderedDict() # new orderedDict to keep the results
for i in sorted_keys:
    d[i]=(L1.get(i,'#'),L2.get(i,'#'))

Это даст

OrderedDict([(10956, ('#', 'A')),
             (10955, ('AB', 'A')),
             (10954, ('AB', 'ABE')),
             (10953, ('ABC', 'ABC')),
             (10952, ('ABCD', 'ABCD')),
             (10951, ('ABCDEF', '#'))])

Чтобы получитьокончательный вывод: list Затем измените приведенный выше код на

lis=[]
for i in sorted_keys:
    lis.append((i,L1.get(i,'#'),L2.get(i,'#')))

Вывод

[(10956, '#', 'A'),
 (10955, 'AB', 'A'),
 (10954, 'AB', 'ABE'),
 (10953, 'ABC', 'ABC'),
 (10952, 'ABCD', 'ABCD'),
 (10951, 'ABCDEF', '#')]
...