2013-07-30 124 views
4

我只是在使用Python 2.7學習Python。我有一個有兩列的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

相關問題