2013-07-30 1 views
4

Я просто изучаю Python с помощью Python 2.7. У меня есть файл csv с двумя столбцами. Столбцы:Словари Python: объединение нескольких списков значений в один список уникальных значений

Coll_id: записи могут быть одиночными или коллекторы могут быть группы

Participant_Coll_id: если Coll_id это один коллектор, то значение будет нулевым. Если Coll_id - это группа, то для каждого Участника в группе будет одна строка.

Образец здесь:

Coll_id,Participant_Coll_id<br> 
ARA,ARG 
ARA,RAT 
ARG,NULL 
BRSAR,SGMB 
BRSAR,SANTM 
BRSAR,CRSR 
BRSAR,RAT 
CRSR,NULL 
DBY,NULL 
HZIE,NULL 
RAT,NULL 
SANTM,NULL 
SGMB,NULL 
ARG,NULL 
DRS,CRSR 
DRS,RAT 
DRS,ARG 

Для каждого коллектора (coll_id), я пытаюсь создать список всех других коллекционеров они собрали с. Я попытался стянуть код, чтобы сделать следующее и это так близко Сейчас:

#This is giving me a dictionary with each COLL_ID having a list of PARTICIPANT_COLL_IDs 

with open('colls_mv1.csv', 'r') as f: 
    reader = csv.DictReader(f, ['COLL_ID', 'PARTICIPANT_COLL_ID']) 
    data1 = defaultdict(list) 

    for line in reader: 
     data1[line['COLL_ID']].append(line['PARTICIPANT_COLL_ID']) 


#And this is giving me a dictionary with each PARTICIPANT_COLL_ID having a list of COLL_IDs 
with open('colls_mv1.csv', 'r') as f: 
    reader = csv.DictReader(f, ['COLL_ID', 'PARTICIPANT_COLL_ID']) 
    data2 = defaultdict(list) 

    for line in reader: 
     if line['PARTICIPANT_COLL_ID'] != 'NULL': 
      data2[line['PARTICIPANT_COLL_ID']].append(line['COLL_ID']) 

dict3 = {k: [data1[i] for i in v] for k, v in data2.items()} 

print dict3 

Я получаю следующий вывод:

{'SGMB': [['SGMB', 'SANTM', 'CRSR', 'RAT']], 'CRSR': [['SGMB', 'SANTM', 'CRSR', 'RAT'], ['CRSR', 'RAT', 'ARG']], 'RAT': [['ARG', 'RAT'], ['SGMB', 'SANTM', 'CRSR', 'RAT'], ['CRSR', 'RAT', 'ARG']], 'PARTICIPANT_COLL_ID': [['PARTICIPANT_COLL_ID']], 'ARG': [['ARG', 'RAT'], ['CRSR', 'RAT', 'ARG']], 'SANTM': [['SGMB', 'SANTM', 'CRSR', 'RAT']]} 

То, что я хотел бы это, чтобы объединить списки значений вместе для каждого ключа, чтобы удалить дубликаты и удалить ключ из списка значений:

{'SGMB': ['SANTM', 'CRSR', 'RAT'], 'CRSR': ['SGMB', 'SANTM', 'RAT', 'ARG'], 'RAT': ['ARG', 'SGMB', 'SANTM', 'CRSR'], 'PARTICIPANT_COLL_ID': [['PARTICIPANT_COLL_ID']], 'ARG': ['RAT', 'CRSR'], 'SANTM': ['SGMB', 'CRSR', 'RAT']} 

ответ

1

перебирать списки, удалить ключи и дедуплицировать

>>> res = {'SGMB': [['SGMB', 'SANTM', 'CRSR', 'RAT']], 'CRSR': [['SGMB', 'SANTM', 'CRSR', 'RAT'], ['CRSR', 'RAT', 'ARG']], 'RAT': [['ARG', 'RAT'], ['SGMB', 'SANTM', 'CRSR', 'RAT'], ['CRSR', 'RAT', 'ARG']], 'PARTICIPANT_COLL_ID': [['PARTICIPANT_COLL_ID']], 'ARG': [['ARG', 'RAT'], ['CRSR', 'RAT', 'ARG']], 'SANTM': [['SGMB', 'SANTM', 'CRSR', 'RAT']]} 
>>> newres = {k: list({x for t in v for x in t if x != k}) for k, v in res.iteritems()} 
>>> newres 
{'SGMB': ['CRSR', 'SANTM', 'RAT'], 'CRSR': ['SANTM', 'SGMB', 'RAT', 'ARG'], 'RAT': ['CRSR', 'SANTM', 'SGMB', 'ARG'], 'PARTICIPANT_COLL_ID': [], 'ARG': ['CRSR', 'RAT'], 'SANTM': ['CRSR', 'RAT', 'SGMB']} 

демо: http://ideone.com/87HKM9

+0

Это так близко - спасибо так много !! Мне просто нужно найти способ удалить дубликаты из каждого списка - и точно определить, что именно я использовал код: – botanist

+0

Дубликаты могут быть удалены с помощью преобразований набора и списка, см. Мое редактирование. – DhruvPathak

+0

Это просто великолепно! Большое вам спасибо за вашу помощь. Он делает именно то, что я хотел этого сделать. – botanist

Смежные вопросы