我需要导入一个包含以下内容的CSV文件:
name,mean performance,std dev
Alice,100,0
Bob,100,5
Clare,100,10
Dennis,90,0
Eva,90,5
并将输出排序为:
{'Dennis': (90.0, 0.0), 'Clare': (100.0, 10.0), 'Eva': (90, 5.0), 'Bob': (100.0, 5.0), 'Alice': (100.0, 0.0)}
到目前为止,我有:
import csv
import collections
def sailorPerf(filename, header=True):
with open(filename, mode='r') as csvfile:
r = csv.reader(csvfile)
if header==True:
next(r)
od = collections.OrderedDict((row[0], row[1]) for row in r)
print (od)
哪个输出:
OrderedDict([('Alice', ' 100'), ('Bob', ' 100'), ('Clare', ' 100'), ('Dennis', ' 90'), ('Eva', ' 90')])
我想知道如何将第三列添加到结果中以及更改格式以使ordereddict部分从输出中删除,并改变输出的方式以获得名称和输出,因为它在预期中结果。
答案 0 :(得分:0)
将(row[0], row[1])
更改为(row[0], tuple(row[1:]))
,使第二个作为包含索引1中所有元素的列表 - 列表末尾,然后将其转换为元组。
答案 1 :(得分:0)
您需要通过第二和第三列转换为int:
对数据进行排序from collections import OrderedDict
def sailorPerf(filename, header=True):
with open(filename, mode='r') as csvfile:
r = csv.reader(csvfile)
if header:
next(r)
od = OrderedDict((name, tuple(rest))
for name,*rest in sorted(r, key=lambda x: (int(x[1]), int(x[2]))))
return od
print(sailorPerf("test.txt"))
输出:
OrderedDict([('Dennis', ('90', '0')), ('Eva', ('90', '5')),
('Alice', ('100', '0')), ('Bob', ('100', '5')),
('Clare', ('100', '10'))])
如果您真的不想看OrderedDict,可以致电list(od.items)
:
print(list(sailorPerf("test.txt").items()))
OrderedDict([('Dennis', ('90', '0')), ('Eva', ('90', '5')),
('Alice', ('100', '0')), ('Bob', ('100', '5')),
('Clare', ('100', '10'))])
对于python2,只需解压缩:
def sailorPerf(filename, header=True):
with open(filename, mode='r') as csvfile:
r = csv.reader(csvfile)
if header==True:
next(r)
od = OrderedDict((nm, (mn, std)))
for nm, mn, std in sorted(r,key=lambda x: (int(x[1]),int(x[2]))))
return od