[英]Python: Build a dictionary from a file's contents
假設我有一個名稱和值的文件,其條目如下:
lasker:22,45,77,101
kramnik:45,22,15,105
什么是Pythonic最方便的方法是將它們作為鍵輸入字典,將值作為列表如下:
{ 'lasker': (22,45,77,101), 'kramnik': (45,22,15,105) }
編輯
反正是按照我從文件中讀取它們的順序迭代它們還是需要不同的數據結構?
我認為這段代碼的工作方式非常清楚:
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
替換dict
:
from collections import OrderedDict
print OrderedDict(get_entries( infile ))
無需關心正則表達式的行:
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'文件的文本
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.