2012-05-11 127 views
0

我想下面的數據轉換爲與第一列作爲元素的ID號和休息字典作爲值轉換列表,以字典

EDF768, Bill Meyer, 2456, Vet_Parking 

TY5678, Jane Miller, 8987, AgHort_Parking 

GEF123, Jill Black, 3456, Creche_Parking 

到目前爲止,我已經打開的文件和數據轉換成名單。但是我不能將它轉換成字典,因爲它表示等式太長。

def createNameDict(): 
     file = open("C:\Users\user\Desktop\\ParkingData_Part2.txt","rt") 
     contents = file.read() 
     print contents,"\n" 
     data_list = [line.split(",") for line in contents.split("\n")] 
     print data_list, "\n" 
     dict_list = [] 
     data_dict = {} 
     for line in data_list: 
     key = line[0] 
     value = (line[1], line[2], line[3]) 
     data_dict[key] = value 
     data_dict = dict() 

     dict_list.append(data_dict) 
     # start dictionary over 
     #print data_dict 
     print (data_list) 


     file.close() 

輸出我是:

[['EDF768', ' Bill Meyer', ' 2456', ' Vet_Parking'], 
['TY5678', ' Jane Miller', ' 8987', ' AgHort_Parking'], 
['GEF123', ' Jill Black', ' 3456', ' Creche_Parking'], 
['ABC234', ' Fred Greenside', ' 2345', ' AgHort_Parking'], 
['GH7682', ' Clara Hill', ' 7689', ' AgHort_Parking'], 
['JU9807', ' Jacky Blair', ' 7867', ' Vet_Parking'], 
['KLOI98', ' Martha Miller', ' 4563', ' Vet_Parking'], 
['ADF645', ' Cloe Freckle', ' 6789', ' Vet_Parking'], 
['DF7800', ' Jacko Frizzle', ' 4532', ' Creche_Parking'], 
['WER546', ' Olga Grey', ' 9898', ' Creche_Parking'], 
['HUY768', ' Wilbur Matty', ' 8912', ' Creche_Parking']] 

能有人給我暗示上述列表轉換成字典,如:

{'EDF768': ' Bill Meyer', ' 2456', ' Vet_Parking'} 
+2

這最後一個例子是不是有效的字典結構。 – jdi

+2

你需要澄清你是否想要一個帶有多個鍵的字典,或者是一個單鍵詞典的列表(我認爲你要選擇後者,但建議你和前者一起去。是你的鍵(我是假設他們是牌照)獨特? –

+0

我同意喬爾,因爲它似乎這個數據結構會更適合作爲一個字典,而不是一個單一的關鍵詞典列表。請澄清你想要的。 – jdi

回答

1
for line in data_list: 
    key = line[0] 
    value = (line[1], line[2], line[3]) 
    data_dict[key] = value 
    dict_list.append(data_dict) 
    data_dict = dict() 

在上面寫的最後一行,您將data_dict()重置爲之前的空字典您將其附加到dict_list。只需切換兩條線(如上所示)。

編輯 爲了讓你的輸出是一個純粹的字典(我假設你所有的鑰匙都是獨一無二的):

def createNameDict(): 
    with open("C:\Users\user\Desktop\\ParkingData_Part2.txt","r") as f: 
     contents = file.read() 
    print contents,"\n" 
    data_list = [line.split(",") for line in contents.split("\n")] 
    print data_list, "\n" 
    data_dict = {} 
    for line in data_list: 
     data_dict[line[0]] = line[1:] 
    print (data_dict) 
    return data_dict 

請注意您想要出來放一點點ambiguous--您給出的dict示例的格式不正確,並且會生成SyntaxError。我相信你的意思是{'EDF768': ('Bill Meyer', ' 2456', ' Vet_Parking')}

+1

我覺得爲了清晰起見應該只是以正確的格式列出它,然後以這種方式評論它。 – jdi

+0

@jdi:好點。 –

1

這是一個有點尷尬的方式,你每次建立你的字典。只需簡化它:

dict_list = [] 
    # data_dict = {} get rid of this 
    for line in data_list: 
    data_dict = {line[0]: line[1:]} 
    dict_list.append(data_dict) 

無需每次都聲明一個字典並清除它。

如果你真正想要的只是一個字典,這樣做:

data_dict = {} 
    for line in data_list: 
    data_dict[line[0]] = line[1:] 
+0

非常感謝最後的回覆是我想要的。 – nrj

+0

@nrj:真棒。如果這解決了您的問題,不要忘記打綠色對號。 – jdi

1

試試這個:

data_dict = {lsitem[0]:lsitem[1:] for lsitem in data_list} 
1

對於初學者來說,使用CSV模塊,它使您的文件的閱讀輕鬆很多:

import csv 

def createNameDict(): 
    data_file = csv.reader(open('ParkingData_Part2.txt', 'rb')) 
    return dict(
     (line[0], line[1:]) for line in data_file 
    ) 
+0

這是我見過的解決方案中最清楚最習慣的方式。 –

7

使用CSV模塊:

import csv 

d = {} 

with open('ParkingData_Part2.txt','r') as fh: 
    for line in csv.reader(fh): 
     key = line.pop(0) 
     d[key] = [item.strip() for item in line] 

print d 

回報

{'TY5678': ['Jane Miller', '8987', 'AgHort_Parking'], 'GEF123': ['Jill Black', '3456', 'Creche_Parking'], 'EDF768': ['Bill Meyer', '2456', 'Vet_Parking']} 
+2

我不能+1足夠。使用正確的工具來完成這項工作。也就是說,我建議在map和'string.strip()'上使用列表理解 - 主要作爲'string.strip()'被棄用,以支持字符串本身的方法。我已經做了編輯。 –