2015-08-10 5 views
-1

Файл содержит:Создание словаря из файла

1 2 
2 6 
2 3 
2 4 
3 1 
3 4 
4 5 
5 4 
6 5 
6 7 
7 6 
7 8 
8 5 
8 7 

Из этого словаря должен быть создан следующим образом:

D = {1: [2], 2: [6,3,4], 3: [1,4], 4: [5], 5: [4], 6: [5,7], 7: [6,8], 8: [5,7]} 

Если первый элемент из строки является ключом. Что является самым эффективным способом?

+3

Это выглядит немного как «сделать мое назначение для меня» вопрос ко мне ... – LondonRob

+0

Наивные способы слишком медленно. Я хочу оптимизировать свою программу. –

+1

Какие наивные способы? Какими способами вы пытались? – Cyphase

ответ

5

Это должно делать то, что вы хотите:

from __future__ import print_function 

from collections import defaultdict 

dict_from_file = defaultdict(list) 

with open('yourfile.txt', 'r') as infile: 
    for line in infile: 
     key, value = [int(x) for x in line.split()] 
     dict_from_file[key].append(value) 

# The dictionary dict_from_file is in the format that you want 
print(dict_from_file) 
+0

Хороший улов на 'int', я это исправлю. Я использовал только 'D', потому что это то, что использовал OP, но вы правы, и обычно я должен выбрать лучшее имя переменной. Уже поздно :). Тем не менее, мы можем так много сделать, когда не знаем, что такое dict_is_: P. – Cyphase

+0

Не нужно, это хороший момент :). – Cyphase

+0

[Обращаясь к комментариям от @ PM2Ring, который указал, что OP хочет 'int' keys/values ​​и что D не является хорошим именем переменной. Не было необходимости удалять комментарии :).] – Cyphase

1

Вы можете сделать это следующим образом: -

import collections 

file = open('data.txt') 
result = collections.defaultdict(list) 
for line in file.readlines(): 
    key, value = line.strip('\n').split(' ') 
    result[key].append(value) 

print(result) 
2

Вы могли бы сделать это без collections модуля, используя setdefault method метод

код :

Inp_file = open('data.txt') 
result = {} 
for line in Inp_file.readlines(): 
    key, value = line.strip('\n').split(' ') 
    result.setdefault(int(key),[]).append(int(value)) 

print(result) 

выход:

{1: [2], 2: [6,3,4], 3: [1,4], 4: [5], 5: [4], 6: [5,7], 7: [6,8], 8: [5,7]} 
+0

Одна небольшая коррекция: 'result.setdefault (int (key), []). Append (int (value))' Ключ и значения должны быть целыми числами. –

+0

Извините, что вы были правильно изменены @ НиколайГосподинов – The6thSense

+0

@ НиколайГосподинов, если какой-либо ответ ответили на ваш вопрос, примите его, нажав галочку или прокомментируйте их ответ, что ваш ответ неверен, чтобы улучшить их ответ – The6thSense

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