我想从具有以下结构的文件中自动形成dictionary
。
str11 str12 str13
str21 str22
str31 str32 str33 str34
...
即每行两个,三个或四个字符串,中间有空格。我想从这个列表中构建的字典必须具有以下结构:
{str11:(str12,str13),str21:(str22),str31:(str32,str33,str34), ... }
(即,所有条目str*1
都是键 - 所有条目都不同 - 其余条目是values
)。我可以使用什么?
答案 0 :(得分:4)
>>> with open('abc') as f:
... dic = {}
... for line in f:
... key, val = line.split(None,1)
... dic[key] = tuple(val.split())
...
>>> dic
{'str31': ('str32', 'str33', 'str34'),
'str21': ('str22',),
'str11': ('str12', 'str13')}
如果您希望保留项目的顺序,请考虑使用OrderedDict
:
>>> from collections import OrderedDict
>>> with open('abc') as f:
dic = OrderedDict()
for line in f:
key, val = line.split(None,1)
dic[key] = tuple(val.split())
...
>>> dic
OrderedDict([
('str11', ('str12', 'str13')),
('str21', ('str22',)),
('str31', ('str32', 'str33', 'str34'))
])
答案 1 :(得分:2)
为简单起见,使用StringIO
实例:
import io
fobj = io.StringIO("""str11 str12 str13
str21 str22
str31 str32 str33 str34""")
一行可以解决问题:
>>> {line.split(None, 1)[0]: tuple(line.split()[1:]) for line in fobj}
{'str11': ('str12', 'str13'),
'str21': ('str22',),
'str31': ('str32', 'str33', 'str34')}
请注意line.split(None, 1)
。这限制了拆分为一个项目,因为我们必须在dict理解中使用.split()
两次。我们不能将中间结果存储为循环中的重用。 None
表示在任何空格处分开。
对于OrderedDict
,你也可以使用生成器表达式来逃避一行:
from collections import OrderedDict
>>> OrderedDict((line.split(None, 1)[0], tuple(line.split()[1:]))
for line in fobj)
OrderedDict([('str11', ('str12', 'str13')), ('str21', ('str22',)),
('str31', ('str32', 'str33', 'str34'))])