此文件格式是標準庫中csv
模塊的設計目的。但是,由於字典鍵只能映射到一件事物,因此不能按照自己的方式佈置字典。一個簡單的方法來解決該限制是對每個電話號碼映射到一個列表的列表,如圖示例代碼和輸出如下:
import csv
result = {}
with open('numbers.txt', 'rb') as input:
for phone_number, name, address in csv.reader(input):
if phone_number in result:
result[phone_number] += [[name, address]]
else:
result[phone_number] = [[name, address]]
print result
輸出:
{'555-328382': [['john paul', '85 big road']],
'555-457645': [['zac fry', "45 tony's rd"], ['kim fry', "45 tony's rd"]],
'555-667282': [['bill higs', '67 hilltop']]}
內的代碼內部for
循環可以通過使用稱爲defaultdict
的另一個標準庫類簡化,該類是dict
的子類。只要引用了不存在的字典值,它們就會自動將字典條目初始化爲指定的默認值。這裏有一個如何能夠被應用到這個例子:
import collections
import csv
result = collections.defaultdict(list)
with open('numbers.txt', 'rb') as input:
for phone_number, name, address in csv.reader(input):
result[phone_number] += [[name, address]]
print result
輸出的第二個版本:
defaultdict(<type 'list'>, {
'555-328382': [['john paul', '85 big road']],
'555-457645': [['zac fry', "45 tony's rd"], ['kim fry', "45 tony's rd"]],
'555-667282': [['bill higs', '67 hilltop']]})
defaultdict
對象可以以其它方式使用,就像你的代碼的其餘部分正常的字典。
你試過用csv嗎? –