用标题值拆分列表:pythonic方式



我有一个文本,如下所示:

[1]
aaa
bbb
[2]
ccc
ddd

我想要什么:

{ 'title1': [ 'aaa', 'bbb' ],
  'title2': [ 'ccc', 'ddd' ] }

我可以用n分割文本,并使用for和一些if语句来实现这一点,但没有"蟒蛇式"的优雅方式?密钥的种类([1], [2](是有限的。

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

item = string.split('n')
result = {}
for i in item:
    # get title item
    if i[0] == '[':
        name = re.sub(r'([|])', '', item[i])
        continue
    # ...and put into result dict
    if name == '1':
        if not 'breakfast' in result:
            result['breakfast'] = []
        result['breakfast'].push(value)
    if name == '2':
        if not 'lunch' in result:
            result['lunch'] = []
        result['lunch'].push(value)
    if name == '3':
        if not 'dinner' in result:
            result['dinner'] = []
        result['dinner'].push(value)
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)

您可以使用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:的枚举

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

您似乎正在尝试解析配置文件,python配置解析器可以提供帮助,这样您就不需要重新发明轮子。请参考页面末尾的示例。

>>>导入ConfigParser>>>进口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']>>>配置项("1"([('aa',无(,('bb',无>>>配置项("2"([('cc',无(,('dd',无

最新更新