在Python中读取csv文件并创建字典
我有一个csv数据集,如下所示:在Python中读取csv文件并创建字典,python,csv,dictionary,Python,Csv,Dictionary,我有一个csv数据集,如下所示: A, 10, USA B,30, UK C,4,IT A,20,UK B,10,USA 我想阅读此csv行并提供以下输出: A has ran 30 miles with average of 15. B has ran 30 miles with average of 20. C has ran 4 miles with average of 4. 到目前为止,我的解决方案是读取csv数据并将其转换为字典,然后对其进行迭代,以查看“A”重复了多少次,以
A, 10, USA
B,30, UK
C,4,IT
A,20,UK
B,10,USA
我想阅读此csv行并提供以下输出:
A has ran 30 miles with average of 15.
B has ran 30 miles with average of 20.
C has ran 4 miles with average of 4.
到目前为止,我的解决方案是读取csv数据并将其转换为字典,然后对其进行迭代,以查看“A”重复了多少次,以及它必须为平均值计算哪些值,并最终生成结果。我已经编写了这段代码,但是我很难有效地计算a重复的次数,并将英里数相加以创建最终输出。有没有想过用Python来实现这一点?对我来说,用C#来做这件事有点容易,但我对Python不是很在行
def main(filename):
f = open(filename,'r')
labels = ['name','miles','country']
data = csv.DictReader(f,labels,delimiter=',')
for line in data:
print (line['name']+" " + "has ran" +" "+ line['miles']+" "+"miles")
f.close()
您可以使用
defaultdict
存储值,然后将其打印出来:
import csv
from collections import defaultdict
with open(filename, 'r') as handle:
reader = csv.DictReader(handle, ['name', 'miles', 'country'])
data = defaultdict(list)
for line in reader:
data[line['name']).append(int(line['miles']))
for runner, distances in data.items():
print '{} ran a total of {} miles and an average of {} miles'.format(
runner, sum(distances), sum(distances) / float(len(distances))
)
我将您的循环使用拆分,如下所示: var1,var2,var3=行分割(“,”)
这将获得每个变量行中的每个值。然后根据需要使用变量。您可以执行以下操作:
from util import load_csv
d = load_csv("log.csv")
from util import load_csv
d = load_csv("log.csv")
您应该使用以下词典:
d = {'Runner': ['A', 'B', 'C', 'A', 'B'], 'Distance': [10, 30, 4, 20, 10], 'Country': ['USA', 'UK', 'IT', 'UK', 'USA']}
load_csv函数使用csv.reader自动创建一个字典,其中的键以它在标题行中找到的条目命名。每个键的字典条目都是对应列中的值列表。文件如下:
. util.py文件包含许多其他函数,但您可以安全地删除它们(只要将import numpy保留在顶部的np
)# Create counter dictionaries for the statistics.
from collections import Counter
n_runs = Counter()
totals = Counter()
# Calculate the total distance.
for runner, distance in zip(d['Runner'], d['Distance']):
n_runs[runner] += 1
totals[runner] += distance
# Print the results.
for runner in set(d['Runner']):
print("%s has run %i miles with an average of %g."
% (runner, totals[runner], totals[runner]/float(n_runs[runner])))
凯文Ops,我没有注意到你想要计算平均值。是的,这就是诀窍。一开始看起来很简单,但如果你是Python新手,它会特别吸引你。如果csv数据集中的行数超过1000,你认为这是一个好的解决方案吗?我希望这个解决方案不是O(n^2),那样会把事情搞砸。@user843681:它是
O(n)
。您在CSV上迭代一次,然后在结果上迭代一次以将其打印出来。