0

ファイルから名前とそれらの名前に関連する統計を読み取るプログラムを書いています。ファイルの各行は別の人物とその統計です。それぞれの人について、姓をキーにし、辞書内のそのキーにリンクされている他のすべてのものを作成したいと思います。プログラムは最初にファイルのデータを配列に格納し、次にそれらの配列要素を辞書に取得しようとしていますが、その方法がわかりません。さらに、for ループが繰り返されるたびに、辞書の以前の内容が上書きされるかどうかはわかりません。これを試みるために使用しているコードは次のとおりです。

f = open("people.in", "r")

tmp = None
people

l = f.readline()
while l:
        tmp  = l.split(',')
        print tmp
        people = {tmp[2] : tmp[0])
        l = f.readline()

people['Smith']

現在発生しているエラーは、構文が正しくないということですが、配列要素を辞書に転送する方法がわかりません。

4

2 に答える 2

3

キー割り当てを使用:

people = {}

for line in f:
    tmp = l.rstrip('\n').split(',')
    people[tmp[2]] = tmp[0]

これはファイルオブジェクトを直接ループし、.readline()ここで呼び出す必要はなく、改行を削除します。

CSV データがあるようです。csvここでモジュールを使用することもできます:

import csv

people = {}

with open("people.in", "rb") as f:
    reader = csv.reader(f)
    for row in reader:
        people[row[2]] = row[0]

または口述理解さえ:

import csv

with open("people.in", "rb") as f:
    reader = csv.reader(f)
    people = {r[2]: r[0] for r in reader}

ここでは、csvモジュールが改行の分割と削除を処理します。

{構文エラーは、開口部を)ではなくa で閉じようとしたことに起因します}

people = {tmp[2] : tmp[0])  # should be }

値ごとに複数のエントリを収集する必要がある場合はrow[2]、これらをリストに収集します。collections.defaultdictインスタンスはそれを容易にします:

import csv
from collections import defaultdict

people = defaultdict(list)

with open("people.in", "rb") as f:
    reader = csv.reader(f)
    for row in reader:
        people[row[2]].append(row[0])
于 2013-11-03T00:24:49.657 に答える
0

上記のGeneralkiddのコメントに応えて、Martijn Pieterのソリューションに加えて、最後に同じ時間を過ごした複数の人々が、より良いフォーマットの回答として投稿しました:

import csv

people = {}

with open("people.in", "rb") as f:
    reader = csv.reader(f)
    for row in reader:
        if not row[2] in people:
            people[row[2]] = list()
        people[row[2]].append(row[0])
于 2013-11-03T00:52:10.933 に答える