2012-06-05 1 views
0

так, например, у меня был текстовый файл с телефонами, именами, адресами людей. , который выглядел, как это с возвратом в конце каждой строкиВключение текста в текстовый файл в списки в словаре

555-667282,bill higs,67 hilltop 

555-328382,john paul,85 big road 

555-457645,zac fry,45 tony's rd 

555-457645,kim fry,45 tony's rd 

и я хотел бы поставить все это в словаре и в словаре номер телефона был ключ и там имя и адрес был список. , поэтому, если бы я хотел напечатать словарь, он выглядел бы примерно так. что бы код, чтобы сделать это

{555-667282: [ 'вексельные higs', '67' на вершине холма], 555-328382: [ 'Джон Пол', '85 большая дорога'], 555- 457645: [ 'Zac жарить', '45 Тони й'], [ 'ким жарить', '45-й Тони']}

+1

Вы пробовали использовать csv? –

ответ

2
dicto = {} 

with open('your_file.txt') as f: 
    for line in f: 
     s_line = line.rstrip().split(',') 
     dicto[s_line[0]] = s_line[1:] 

Edit:

Для обработки случаев, когда имеется несколько записи, связанные с одним номером телефона:

from collections import defaultdict 

dicto = defaultdict(list) 

with open('your_file.txt') as f: 
    for line in f: 
     s_line = line.rstrip().split(',') 
     dicto[s_line[0]].append(s_line[1:]) 
+0

Это неправильно обрабатывает случай, когда есть две записи с тем же номером телефона. – martineau

+0

Я пропустил это. Спасибо за указание на это. Я отредактировал свое сообщение, чтобы ответить на этот вопрос. – Akavall

1

Этот формат файла - это то, для чего был разработан модуль 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 объекты в противном случае могут быть использованы так же, как обычный словарь по остальной части кода.

Смежные вопросы