2015-04-28 32 views
-1

我正在試圖找到一種方法來使用Python腳本在列表中的多個項目中創建一本詞典。有問題的列表這個樣子,只是僅舉幾例:從列表中的多個項目製作詞典

['331416', 'Macromedaeus', 'distinguendus', '|', '|', 'scientific', 'name','|'] 
['331417', 'Physalopteroidea', '|', '|', 'scientific', 'name', '|'] 
['331418', 'Dracunculus', 'insignis', '|', '|', 'scientific', 'name', '|'] 
['331419', 'Bejaria', 'sprucei', '|', '|', 'scientific', 'name', '|'] 
['331420', 'Paecilomyces', 'sp.', 'JCM', '12545', '|', '|', 'scientific', 'name', '|'] 

這是我發現麻煩了,因爲我不知道如何去這樣做。第一個項目是一個ID,第二個項目是有機體屬名,有時第三個項目有一個物種名稱,有時候沒有,第二個項目的情況就是如此。我需要創建一個字典,使用身份證號碼作爲關鍵字和有機體屬和物種名稱(如果給出)作爲值。

我該如何去做這件事?我目前正在使用Python。 2.7.8。

+4

你有什麼已經嘗試過? – laker001

+0

您可以給出給定示例輸入的示例輸出嗎? – orlp

+0

'dict((a [0],a [1:])for a my_list)'會產生一個字詞 –

回答

1
input = [ 
['331416', 'Macromedaeus', 'distinguendus', '|', '|', 'scientific', 'name','|'], 
['331417', 'Physalopteroidea', '|', '|', 'scientific', 'name', '|'], 
['331418', 'Dracunculus', 'insignis', '|', '|', 'scientific', 'name', '|'], 
['331419', 'Bejaria', 'sprucei', '|', '|', 'scientific', 'name', '|'], 
['331420', 'Paecilomyces', 'sp.', 'JCM', '12545', '|', '|', 'scientific', 'name', '|'] 
] 

taxonomy = {} 
for r in input: 
    taxonomy[r[0]] = {} 
    taxonomy[r[0]]['genus'] = r[1] 
    if r[2] != '|': 
    taxonomy[r[0]]['specie'] = " ".join(r[2:r.index("|")]) 

得到以下的taxonomy

{ 
'331418': {'genus': 'Dracunculus', 'specie': 'insignis'}, 
'331419': {'genus': 'Bejaria', 'specie': 'sprucei'}, 
'331420': {'genus': 'Paecilomyces', 'specie': 'sp. JCM 12545'}, 
'331416': {'genus': 'Macromedaeus', 'specie': 'distinguendus'}, 
'331417': {'genus': 'Physalopteroidea'} 
} 
+0

@Russ我修復了mi舊帖子中的一個錯誤;) –

-1

考慮到列表中的一個做這樣的事情:

mydict = {} 
mylist = ['331416', 'Macromedaeus', 'distinguendus', '|', '|', 'scientific', 'name','|'] 
mydict[mylist[0]] = mylist[1:] 

print mydict 

,是以ID爲重點,使列表的其餘部分的價值。

然後根據這些列表的存儲位置,您可以遍歷並將它們全部添加到字典中。

1

輸出,如果你想用鑰匙將ID號和值的字典是一個簡單的列表(而不是一個字典)使用defaultdict,這使得你有列表值。

import re # import regular expressions 
from collections import defaultdict # use default dictionary 


# your lists 
combinedlist = [ 
['331416', 'Macromedaeus', 'distinguendus', '|', '|', 'scientific', 'name','|'], 
['331417', 'Physalopteroidea', '|', '|', 'scientific', 'name', '|'], 
['331418', 'Dracunculus', 'insignis', '|', '|', 'scientific', 'name', '|'], 
['331419', 'Bejaria', 'sprucei', '|', '|', 'scientific', 'name', '|'], 
['331420', 'Paecilomyces', 'sp.', 'JCM', '12545', '|', '|', 'scientific', 'name', '|'] 
] 

# make a regular expression pattern for an id number that is exactly 6 digits 
# this is flexible-- if you wanted an id number between 4 and 6 digits, use \d{4,6} 
id_num = re.compile("\d{6}") 

# your default dictionary which has lists as values 
d = defaultdict(list) 

# iterate through your combined list 
for list in combinedlist: 
    n = len(list) 
    new_entry = [] 
    # for all the entries of each list 
    for i in range(1, n): 
     new_entry.append(list[i]) 
    d[list[0]] = new_entry 


# print 
for key in d.keys(): 
    print 'key: ',key, '\n value:',d[key] 

這裏的輸出

key: 331418 
    value: ['Dracunculus', 'insignis', '|', '|', 'scientific', 'name', '|'] 
key: 331419 
    value: ['Bejaria', 'sprucei', '|', '|', 'scientific', 'name', '|'] 
key: 331420 
    value: ['Paecilomyces', 'sp.', 'JCM', '12545', '|', '|', 'scientific', 'name', '|'] 
key: 331416 
    value: ['Macromedaeus', 'distinguendus', '|', '|', 'scientific', 'name', '|'] 
key: 331417 
    value: ['Physalopteroidea', '|', '|', 'scientific', 'name', '|'] 
+0

查看@Jose Ricardo Bustos M.的回覆,我稍微編輯了我的回覆使其更加清晰(謝謝Jose) – Seunginah

+0

我很高興:) ... 。練習你的算法可以簡化爲單行使用list comprehension .....'d = dict([(v [0],v)for v in combinedlist])' –

+0

謝謝! :) @JoseRicardoBustosM。 – Seunginah