我有一个文本,如下所示:
[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',无