У меня есть .txt файл со значениями, такими как:

1 3 4
2 5 6
5 7

Я хочу создать словарь так:

1 [3, 4]
2 [5, 6]
5 [7]

Первое число в строке - это ключ, а оставшаяся часть - это значения, которые нужно поместить в список.

Какой самый эффективный способ добиться этого? Я знаю способ итерации с помощью

f = open('data.txt','r')
for i in f:

А затем с помощью условия создать список, а затем добавить это к dict. Но я хочу более аккуратный способ сделать это.

2
Harshavardhan Ramanna 7 Дек 2016 в 19:23

4 ответа

Лучший ответ

Используйте collections.defaultdict,

import collections 

d = collections.defaultdict(list)

with open('data.txt','r') as fp:
    for line in fp:
        l = map(int, line.strip().split())
        d[l[0]].extend(l[1:])

print(d)
# defaultdict(<type 'list'>, {1: [3, 4], 2: [5, 6], 5: [7]})
1
SparkAndShine 7 Дек 2016 в 16:28

Вот опция без импорта и преобразования записей в целые:

testDict = {}

with open('test.txt') as f:
   lines = f.readlines()
   for line in lines:
      line = map(int, line.split(' '))
      testDict[line[0]] = list(line[1:])

print testDict # -> {1: [3, 4], 2: [5, 6], 5: [7]}
0
Kat 7 Дек 2016 в 17:37

Вот еще один, более прямой, способ сделать это:

d = {}
with open('somedata.txt', 'rt') as f:
    for line in f:
        numbers = map(int, line.split())
        numbers = list(numbers) # for Python 3
        d.setdefault(numbers[0], []).extend(numbers[1:])

print(d)  # -> {1: [3, 4], 2: [5, 6], 5: [7]}
2
martineau 7 Дек 2016 в 17:01

Разбейте каждую строку на пару (ключ, значения) и добавьте их к стандартному dict с пустым списком в качестве начального значения

from collections import defaultdict

mydict = defaultdict(list)

for line in f.readlines():
    line = [int(item) for item in line.split()]
    key, *values = line
    mydict[key].extend(values)
1
blue_note 7 Дек 2016 в 16:29