Python: создать словарь из содержимого файла - PullRequest
2 голосов
/ 19 января 2011

Скажите, что у меня есть файл имен и значений с записями вроде этого:

lasker:22,45,77,101
kramnik:45,22,15,105

Какой самый Pythonic способ получить их в словарь с именем в качестве ключа и значениями в виде спискакак это:

{ 'lasker': (22,45,77,101), 'kramnik': (45,22,15,105) }

РЕДАКТИРОВАТЬ

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

Ответы [ 2 ]

13 голосов
/ 19 января 2011

Я думаю, довольно ясно, как работает этот код:

def get_entries( infile ):
    with open( infile, 'rt') as file:
        for line in file:
            name, nums = line.split(':', 1)
            yield name, tuple(int(x) for x in nums.split(','))

# dict takes a sequence of  `(key, value)` pairs and turns in into a dict
print dict(get_entries( infile ))

Написание генератора, дающего пары, и передача его в dict - чрезвычайно полезный шаблон.

Если вы просто хотите перебрать пары, вы можете сделать это напрямую:

for name, nums in get_entries( infile ):
    print name, nums

но если вам нужен доступ к диктату позже, но также и при заказе, вы можете просто заменить dict на OrderedDict:

from collections import OrderedDict
print OrderedDict(get_entries( infile ))
0 голосов
/ 19 января 2011

Не нужно заботиться о строках с регулярным выражением:

import re

pat = re.compile('([a-z]+)\s*:\s*(\d+(?:\s*,\s*\d+)*)')

with open('rara.txt') as f:
    dic = dict((ma.group(1),map(int,ma.group(2).split(','))) for ma in pat.finditer(f.read()))

print dic

Протестировано со следующим текстом в тексте файла 'rara.txt':

lasker :  22,45,  77,101 kramnik:888 ,22,15,105  kramniu :45,22,    3433,105 6765433 laskooo:22,45, 77 , 101  kooni:
45, 78 45kramndde:45,334 ,15,105 tasku: 22,45  ,7,101 krammma:  1105oberon glomo:22, 3478,77 ,101 draumnik:45,105 
toyku:22,45,7,101 solo
   ytrmmma:1105oberon radabidadada lftyker:22,3478,7,101

Результат

{'laskooo': [22, 45, 77, 101], 'tasku': [22, 45, 7, 101], 'krammma': [1105], 'glomo': [22, 3478, 77, 101], 'kramniu': [45, 22, 3433, 105], 'kooni': [45, 78], 'lftyker': [22, 3478, 7, 101], 'toyku': [22, 45, 7, 101], 'kramnik': [888, 22, 15, 105], 'draumnik': [45, 105], 'ytrmmma': [1105], 'lasker': [22, 45, 77, 101], 'kramndde': [45, 334, 15, 105]}

РЕДАКТИРОВАТЬ: я изменил шаблон регулярного выражения (добавлено \ s *) и текст файла 'rara.txt'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...