我正在编写一个程序,从csv文件中获取学生分数,然后需要从最高分到最低分。 csv文件如下所示:
乔什12
约翰6
弗雷德8
哈里7
我试图将这些项目放在这样的列表中:
Mylist=[]
csvfile = open (classname,'r')
reader = csv.reader(csvfile)
for row in reader:
Mylist.append(row)
然后反转列表以将数值放在第一位:
Mynewlist = []
for each in Mylist:
value2 = ''.join(each[0])
value1 = ''.join(each[1])
mynewlist.append(value1,value2)
没有运气我得到这个错误:
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
main()
File "\\SRV-FILE3\ca231$\task 3\3.py", line 143, in main
value1 = ''.join(each[1])
IndexError: list index out of range
我使用''.join(each[1])
转换为字符串,然后以相反的顺序附加它们然后我打算使用.sort()
以数字方式对它们进行排序,但我不能让它们附加到列表中。
有谁知道如何按照数值对csv文件的内容进行排序?
答案 0 :(得分:3)
我认为你过于复杂。假设您将数据作为列表列表:
data = [("josh", "12"), ("john", "6"), ("fred", "8"), ("harry", "7")]
这当然可能来自CSV,对排序无关紧要。您只需拨打sorted()
:
sorted(data, key = lambda x: int(x[1]))
lambda
是一个函数,它将每个子列表的第二个元素选为关键字,即得分,并将其转换为数字以进行排序。这打印:
[('john', '6'), ('harry', '7'), ('fred', '8'), ('josh', '12')]
答案 1 :(得分:1)
您可以执行以下操作:(根据您的值创建字典)
for row in reader:
my_dict = {row[0]:row[1]}
然后你可以表示一个排序的字典(字典本身就是无序的,所以这将是一个列表):
import operator
sorted_dict = sorted(my_dict.items(), key=operator.itemgetter(1))
值得注意的是,有更好/更简单的方法(例如Panda),但至少你学习了不同的方法:)
答案 2 :(得分:1)
如果您的所有CSV包含的是姓名和号码,并且您的姓名是唯一的,那么
使用以下代码根据值(在您的情况下得分)进行排序
import operator
x = {"josh": 12, "john": 6, "fred": 8, "harry": 7,}
sorted_x = sorted(x.iteritems(), key=operator.itemgetter(1))
答案 3 :(得分:1)
from operator import itemgetter
result = []
with open("data", 'r') as f:
r = csv.reader(f, delimiter=' ')
# next(r, None) # skip the headers
for row in r:
result.append(row[:-1])
# sort by numeric part, which is a key value for sorted.
# itemgetter(1) gets the number in each sublist
print(sorted(result,key=itemgetter(1)))
[['josh', '12'], ['john', '6'], ['harry', '7'], ['fred', '8']]
答案 4 :(得分:1)
您可以使用pandas。
import pandas as pd
df = pd.read_csv('students.csv', header=None)
df.columns = ['Name', 'Score']
df.sort('Score', ascending=False, inplace=True)
最后,您将拥有一个如下所示的数据框:
Name Score
0 josh 12
2 fred 8
3 harry 7
1 john 6
代码正在读取您的CSV文件,并明确说明没有标头。默认情况下,pandas假定第一行包含列标题。由于没有任何标头,我们会添加:Name
和Score
。最后,我们根据Score
列对其进行排序。您可以通过删除inplace=
参数并执行此操作来保持原始数据框保持不变:
sorted_df = df.sort('Score', ascending=False)
在此行之后,您的原始文件位于df
,而已排序的文件位于sorted_df
答案 5 :(得分:1)
如果data
文件中的csv
如下所示:
josh 12
john 6
fred 8
harry 7
然后,您可以创建dictionary
并使用key=d.__getitem__
:
import csv
with open('yourfile.csv', 'rb') as f:
reader = csv.reader(f)
d = {}
for row in f:
row = row.split(",")
d[row[0]]=int(row[1])
k = sorted(d, key=d.__getitem__, reverse=True)
v = sorted(d.values(), reverse=True)
sorted_d = zip(k,v)
print (sorted_d)
输出:
[('josh', 12), ('fred', 8), ('harry', 7), ('john', 6)]