我正在尝试从文件中的多行创建一个字典,例如。
grocery store
apples
banana
bread
shopping mall
movies
clothing stores
shoe stores
我要做的是将每个部分(即杂货店和购物中心)的第一行设置为键和下面的所有内容(分别是苹果,香蕉,面包和电影,服装店,鞋店) 。我一直在使用readline方法+ while循环,但我无法弄明白。如果有人知道,请帮助。感谢。
答案 0 :(得分:1)
一种解决方案是在变量中存储布尔值,以确定您是否在某个部分的开头。我不想放弃令人兴奋的(?)结尾,但你可以从is_first=True
开始。
好吧,我想我确实想放弃结局。这就是我的想法,或多或少:
with open(fname) as f:
content = f.readlines()
is_first = True
d = {}
for line in content:
if line == '\n':
is_first = True
elif is_first:
key = line
is_first = False
else:
if key not in d:
d.put(key, '')
d.put(key, d.get(key) + line)
is_first = False
我发现以这种方式规划代码更容易。当然,你也可以在没有is_first
变量的情况下解决这个问题,特别是如果你已经使用is_first
变量进行了这样的操作。我认为以下是正确的,但我并不是非常小心:
with open(fname) as f:
content = f.readlines()
d = {}
while content:
key, content = content[0], content[1:]
if key != '\n':
value, content = content[0], content[1:]
while value != '\n':
if key not in d:
d.put(key, '')
d.put(key, d.get(key) + value)
value, content = content[0], content[1:]
答案 1 :(得分:1)
@minopret已经给出了一个教学上有用的答案,这对初学者来说很重要。从某种意义上说,即使是一些看似复杂的方法也经常在幕后进行 - 使用一种状态机,我的意思是 - 所以知道这一点非常重要。
但是对于它,我将描述一种更高级别的方法。有一个方便的函数itertools.groupby
,它将序列分组为连续的组。在这种情况下,我们可以通过一堆并非全为空的行来定义一个组 - 如果该行为空,则bool(line)
为False
,否则为True
,然后构建一个dict
来自他们。
from itertools import groupby
with open("shopdict.txt") as fin:
stripped = map(str.strip, fin)
grouped = (list(g) for k,g in groupby(stripped, bool) if k)
d = {g[0]: g[1:] for g in grouped}
答案 2 :(得分:0)
from itertools import groupby
with open("shopdict.txt") as fin:
stripped = map(str.strip, fin)
d = {k: g for b, (k, *g) in groupby(stripped, bool) if b}
这是使用for
循环
d={}
with open("shopdict.txt") as fin:
for key in fin:
key = key.strip()
d[key] = []
for item in fin:
if item.isspace():
break
d[key].append(item.strip())