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

这将首先创建包含三个条目的列表(因此您可以使用[0][1]然后使用[2]不会出错),然后将一个分配给列表中的正确条目。

于 2013-09-17T18:52:56.540 回答
2

您可以使用默认字典:

from collections import defaultdict

ncols = 3
d = defaultdict(lambda: [0 for i in range(ncols)])
于 2013-09-17T18:55:27.927 回答
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 回答
0

使用 defaultdict 和 Counter 您可以提出一个 dict ,它可以让您轻松地测量一个键出现在某个位置的次数(在本例中为第 1、第 2 或第 3 次,按切片)

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 回答