0

ファイル内の複数の行から辞書を作成しようとしています。

grocery store
apples
banana
bread

shopping mall
movies
clothing stores
shoe stores

私がやろうとしているのは、各セクションの最初の行 (つまり、食料品店とショッピング モール) をキーにし、その下にあるすべてのもの (それぞれリンゴ、バナナ、パンと映画、衣料品店、靴屋) を値にすることです。私はreadlineアプローチ+ whileループをいじっていましたが、それを理解することができませんでした。知っている方がいましたら、助けてください。ありがとう。

4

3 に答える 3

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}
于 2013-03-18T04:04:08.737 に答える
1

解決策の 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:]
于 2013-03-18T01:28:38.547 に答える
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())
于 2013-03-18T10:33:28.780 に答える