2012-05-11 125 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()'被弃用,以支持字符串本身的方法。我已经做了编辑。 –