从文件中构造特殊词典(python)

2024-06-16 10:13:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从具有以下结构的文件自动形成dictionary。你知道吗

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

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

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

(也就是说,所有的条目str*1都是键——它们都是不同的——剩下的就是values)。我能用什么?你知道吗


Tags: 文件字符串列表dictionary结构空格str32str12
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'))])
>>> 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')}

如果要保留项目的顺序,请考虑使用^{}

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

相关问题 更多 >