构造文件中的特殊字典(python)

时间:2013-06-08 10:44:45

标签: python dictionary

我想从具有以下结构的文件中自动形成dictionary

str11 str12 str13
str21 str22
str31 str32 str33 str34
...

即每行两个,三个或四个字符串,中间有空格。我想从这个列表中构建的字典必须具有以下结构:

{str11:(str12,str13),str21:(str22),str31:(str32,str33,str34), ... }

(即,所有条目str*1都是键 - 所有条目都不同 - 其余条目是values)。我可以使用什么?

2 个答案:

答案 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'))])