Python - 来自 CSV 文件的字典,每个键有多个值

标签 python csv dictionary

我正在尝试从 python 中的 csv 文件制作字典。假设 CSV 包含:

Student   food      amount
John      apple       15
John      banana      20
John      orange      1
John      grape       3
Ben       apple       2
Ben       orange      4
Ben       strawberry  8
Andrew    apple       10
Andrew    watermelon  3

我设想的是一个字典,其键为学生姓名,列表为值,其中每个条目对应不同的食物。 我将不得不计算第二列中独特食品的数量,这就是向量的长度。 例如:

The value of [15,20,1,3,0,0] would correspond to [apple, banana, orange, grape, strawberry, watermelon] for  'John'. 
The value of [2,0,4,0,8,0] would correspond to [apple, banana, orange, grape, strawberry, watermelon] for 'Ben'.
The value of [10,0,0,0,0,3] would correspond to [apple, banana, orange, grape, strawberry, watermelon] for 'Andrew'

字典的预期输出如下所示:

dict={'John':{[15,20,1,3,0,0]}, 'Ben': {[2,0,4,0,8,0]}, 'Andrew': {[10,0,0,0,0,3]}}

我在创建字典时遇到问题,或者字典是否是正确的方法。我要开始的是:

import csv
data_file=open('data.csv','rU')
reader=csv.DictReader(data_file)
data={}
for row in reader:
    data[row['Student']]=row
data_file.close()

感谢您花时间阅读。任何帮助将不胜感激。

最佳答案

这是一个使用普通字典的版本。不过,Defaultdict 肯定更好。

import csv
data_file=open('data.csv','rU')
reader=csv.DictReader(data_file)
data={}
for row in reader:
    if row['Student'] in data:
        data[row['Student']].append(row['amount'])
    else:
        data[row['Student']] = [row['amount']]
data_file.close()

编辑:

For matching indicies
import csv
from collections import defaultdict

data_file=open('data.csv','rU')
reader=csv.DictReader(data_file)
data=defaultdict(lambda:[0,0,0,0])
fruit_to_index = defaultdict(lambda:None,{'apple':0,'banana':1,'orange':2,'grape':3})
for row in reader:
    if fruit_to_index[row['food']] != None:
        data[row['Student']][fruit_to_index[row['food']]] = int(row['amount'])
data_file.close()

打印数据会是

defaultdict(<function <lambda> at address>, 
{'John':  [15, 20, 1, 3], 
'Ben':    [2 , 0 , 0, 0], 
'Andrew': [10, 0 , 0, 0]})

我想这就是你想要的。

编辑2: 当水果列表不包括草莓和西瓜时这样做,但应该很容易添加。 如果列表太大

生成水果到索引的映射

set_of_fruits = set()
for row in reader:
    set_of_fruits.add(row['food'])
c = 0
for e in set_of_fruits:
    fruit_to_index[e] = c
    c += 1

请注意,不会生成 set_of_fruits 的顺序。

data = defaultdict(lambda:[0,0,0,0]) 变成

data = defaultdict(lambda:[0 for x in range(len(set_of_fruits))])

关于Python - 来自 CSV 文件的字典,每个键有多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21893333/

相关文章:

python - 在嵌套字典中搜索关键树

python - 使用 Ansible 连接到 AWS EC2 实例

python - 在外部范围中定义的阴影名称有什么问题?

python - 类函数输出正确但方法错误

python - 在 Lambda 中读取 AWS S3 CSV 列名

压缩对象上的 python map()

Python正则表达式

java代码如何读取csv文件中的空值

javascript - 使用 NodeJS 解析 CSV 时出现奇怪的编码问题

python - Python 列表字典中的最小总和