我如何在python

时间:2015-10-16 13:50:31

标签: python list sorting csv numerical

我正在编写一个程序,从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文件的内容进行排序?

6 个答案:

答案 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包含的是姓名和号码,并且您的姓名是唯一的,那么

  1. 将CSV内容存储为{name:score}作为dict
  2. 使用以下代码根据值(在您的情况下得分)进行排序

    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假定第一行包含列标题。由于没有任何标头,我们会添加:NameScore。最后,我们根据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)]