拆分标题值列表:pythonic方式

时间:2015-06-04 17:14:50

标签: python

我有一个文字,如下:

method

我想要的是什么:

[1]
aaa
bbb
[2]
ccc
ddd

我可以将此文字与{ 'title1': [ 'aaa', 'bbb' ], 'title2': [ 'ccc', 'ddd' ] } 分开并使用\n和一些for语句来完成此操作,但没有'pythonic',优雅的方式吗?密钥类型(if)是有限的。

编辑:我的尝试就在这里,所以硬编码:

[1], [2]

3 个答案:

答案 0 :(得分:2)

from collections import defaultdict
result = defaultdict(list)
current_key = "ERROR - MISSING TITLE"
with open('youfile.txt', 'r') as f:
    for line in f:
        item = line.strip()
        if item.strip('[]') != item:
            current_key = item.strip('[]')
        else:
            result[current_key].append(item)

如果您不想使用defaultdict,可以执行result = {}并将result[current_key].append(item)更改为result.setdefault(current_key, []).append(item)

答案 1 :(得分:1)

您可以使用groupby将不以[开头的行与OrderedDict分组,以保持数据在文件中出现的顺序:

from itertools import groupby, imap
from collections import OrderedDict
with open("in.txt") as f:
    grouped = groupby(imap(str.rstrip, f), lambda x: x[0] == "[")
    od = OrderedDict(("title{}".format(next(v).strip("[]")), list(next(grouped)[1]))
                     for k, v in grouped)

输出:

OrderedDict([('title1', ['aaa', 'bbb']), ('title2', ['ccc', 'ddd'])])

如果数字始终从1开始,只需使用enumerate,其起始索引为1:

od = OrderedDict(("title{}".format(ind), list(next(grouped)[1]))
                 for ind, (k, v) in enumerate(grouped, 1))

答案 2 :(得分:0)

您似乎正在尝试解析配置文件,python configparser可以提供帮助,因此您无需重新发明轮子。参考页面末尾的示例。


    >>> import ConfigParser
    >>> import io
    >>>
    >>> sample_config = """
    ... [1]
    ... aaa
    ... bbb
    ... [2]
    ... ccc
    ... ddd
    ... """
    >>> config = ConfigParser.RawConfigParser(allow_no_value=True)
    >>> config.readfp(io.BytesIO(sample_config))
    >>> config.sections()
    ['1', '2']
    >>> config.items("1")
    [('aaa', None), ('bbb', None)]
    >>> config.items("2")
    [('ccc', None), ('ddd', None)]