1

内部にネストされたリストを持つ辞書を作成しようとしています。

目標は、次のようにすることです。

key : [x,y,z]

csv ファイルから情報を取得し、特定のキーが各列に表示される回数を数えています。ただし、以下のエラーが表示されます

> d[key][i] = 1
KeyError: 'owner'

ここで、所有者は私のコラムのタイトルです。

if __name__ == '__main__':
    d = {}
    with open ('sample.csv','r') as f:
        reader = csv.reader(f)
        for i in range(0,3):
            for row in reader:
                key = row[0]
                if key in d:
                    d[key][i] +=1
                else:
                    d[key][i] = 1

    for key,value in d.iteritems():
        print key,value

このループで何を微調整して、存在しない場合はキーを作成し、存在する場合は追加しますか?

4

4 に答える 4

4

問題は、リストがない場所でリスト ( ) を使用しようとすること[i]です。

だから交換すればいい

d[key][i] = 1

d[key] = [0,0,0]
d[key][i] = 1

これにより、最初に 3 つのエントリを含むリストが作成され (したがって、後でエラーなしで使用でき[0]ます[1]) [2]、次にリスト内の正しいエントリに 1 つが割り当てられます。

于 2013-09-17T18:52:56.540 に答える
2

defaultdict を使用できます。

from collections import defaultdict

ncols = 3
d = defaultdict(lambda: [0 for i in range(ncols)])
于 2013-09-17T18:55:27.927 に答える
0

defaultdict と Counter を使用すると、ある位置 (この場合は 1 番目、2 番目、または 3 番目) にキーが出現した回数を簡単に測定できる dict を作成できます。

csv = [
    ['a','b','c','d'],
    ['e','f','g', 4 ],
    ['a','b','c','d']
]

from collections import Counter, defaultdict

d = defaultdict(Counter)

for row in csv:
    for idx, value in enumerate(row[0:3]):
        d[value][idx] += 1

使用例:

print d
print d['a'][0] #number of times 'a' has been found in the 1st position
print d['b'][2] #number of times 'b' found in the 3rd position
print d['f'][1] #number of times 'f' found in 2nd position
print [d['a'][n] for n in xrange(3)] # to match the format requested in your post

defaultdict(<class 'collections.Counter'>, {'a': Counter({0: 2}), 'c': Counter({2: 2}), 'b': Counter({1: 2}), 'e': Counter({0: 1}), 'g': Counter({2: 1}), 'f': Counter({1: 1})})
2
0
1
[2, 0, 0]

または関数に入れます:

def occurrences(key):
    return [d[key][n] for n in xrange(3)]

print occurrences('a') # [2, 0, 0]
于 2013-09-17T19:31:12.513 に答える
0

try、catch ブロックを使用してリストを新しいキーに追加し、必要に応じてインクリメントします

if __name__ == '__main__':
    d = {}
    with open ('sample.csv','r') as f:
        reader = csv.reader(f)
        for i in xrange(0,3):
            for row in reader:
                key = row[i]
                try: d[key][i] += 1
                except KeyError:
                    d[key] = [0, 0, 0]
                    d[key][i] = 1

    for key,value in d.iteritems():
        print key,value
于 2013-09-17T18:53:35.717 に答える