私は計画したオブジェクトを構築するためにそれらのファイルからデータを選択するために、開いたファイルのセットを解析するためにPython 3.5を使用して、後でエクスポートする。私はもともと各ファイル全体を解析し、分析を行う前に辞書オブジェクトのリストを作成していましたが、このプロセスは時には30秒かかることがあり、各ファイルの各行を1回だけ処理する必要があるため、その発電機を使用する絶好の機会となっています。しかし、私は、発電機を概念的に、そしておそらく発電機内の物体の変更可能性を見逃していると感じています。次のように辞書のリストを作るPython Generatorの表現とリストと辞書の理解の比較:入れ子になっている辞書の奇妙さ
私の元のコードは行く:
parsers = {}
# iterate over files in the file_name file to get their attributes
for dataset, data_file in files.items():
# Store each dataset as a list of dictionaries with keys that
# correspond to the attributes of that dataset
parsers[dataset] = [{attributes[dataset][i]: value.strip('~')
for i, value in enumerate(line.strip().split('^'))}
for line
in data_file]
そして私は呼び出すことでリストにアクセス:
>>>parsers['definitions']
そして予想通り、それは辞書のリストを返す動作します。しかし、このリストをジェネレータに変換すると、あらゆる種類の奇妙なことが起こります。
parsers = {}
# iterate over files in the file_name file to get their attributes
for dataset, data_file in files.items():
# Store each dataset as a list of dictionaries with keys that
# correspond to the attributes of that dataset
parsers[dataset] = ({attributes[dataset][i]: value.strip('~')
for i, value in enumerate(line.strip().split('^'))}
for line
in data_file)
そして私は使用してそれを呼び出す:範囲エラーのうちのインデックスを返します
>>> next(parsers['definitions'])
をこのコードを実行します。
2つのコードセグメントの主な違いは、リストの解説バージョンでは、ファイルからリストを作成し、後で使用するための解説変数を格納する必要がなくなります。
逆に、ジェネレータ表現では、ジェネレータ内で定義された変数はジェネレータに格納する必要があります。これは後でジェネレータの呼び出しをコードの後に実行するためです。おそらく、ジェネレータ内部の変数は、私のコードが作成する他のジェネレータと名前空間を共有しているので、各ジェネレータは最後に実行されたジェネレータ式に基づいて不規則な振る舞いをするため、変数の値を最後に設定すると考えています。
私はこの問題の理由を考えています。
完全なトレースバックを投稿できますか?それは役に立つかもしれません。 。 。 – mgilson