Как объединить значения словаря, если ключи совпадают - PullRequest
0 голосов
/ 24 октября 2018

У меня есть словарь, подобный этому

Dic1 = 
{'SAP_10_L1': ['SAP_10_L1_R1_001.gz'],'SAP_10_L2': ['SAP_10_L2_R1.gz'],
 'SOS-02289_4_5_L1': ['SOS_4_5_L1.gz'],
 'SOS-02289_4_5_L2': ['SOS_4_5_L2.gz']}

Теперь мне нужно объединить значения Dic, если первая часть ключа совпадает с первой частью значения.Первая часть для ключей до "L", приведенные выше примеры SAP_10 и SOA_4_5 являются уникальными первыми частями.Моя цель состоит в том, чтобы мои Dic1 выглядели так:

Dic1 = {'SAP_10_L1': ['SAP_10_L1_R1_001.gz','SAP_10_L2_R1.gz'],
 'SOS-02289_4_5_L1': ['SOS_4_5_L1.gz','SOS_4_5_L2.gz']}

Я пробовал это:

{i:list(j) for i in Dic1.keys() for j in Dic1.values()}

Но это не дает того, что мне нужно.Любая помощь очень ценится.

1 Ответ

0 голосов
/ 24 октября 2018

Это один подход, использующий itertools

Пример:

from itertools import groupby, chain

d = {'SAP_10_L1': ['SAP_10_L1_R1_001.gz'],'SAP_10_L2': ['SAP_10_L2_R1.gz'],
 'SOS-02289_4_5_L1': ['SOS_4_5_L1.gz'],
 'SOS-02289_4_5_L2': ['SOS_4_5_L2.gz']}

result = {}
for k,v in groupby(sorted(d.items()), lambda x: x[0].rsplit("_", 1)[0]):
    value = list(v)
    result[value[0][0]] = list(chain.from_iterable([i[1] for i in value]))
print(result)

Выход:

{'SAP_10_L1': ['SAP_10_L1_R1_001.gz', 'SAP_10_L2_R1.gz'],
 'SOS-02289_4_5_L1': ['SOS_4_5_L1.gz', 'SOS_4_5_L2.gz']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...