0

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

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

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

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

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

4

2 回答 2

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'))
])
于 2013-06-08T10:47:22.597 回答
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). 这将拆分限制为一项,因为我们必须.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'))])
于 2013-06-08T10:50:27.343 回答