2016-12-02 62 views
0

以下功能采用格式化等级类型,等级类型编号,等级的csv文件。前10个例子是作业,作业编号,等级。该函数将这些前10列入列表。更改CSV文件以更改打印订单或数据

此刻它在打印顺序assigment,assigment number,grade,但我试图按照等级,assigment,assigment号码的顺序打印它。

def assigment(file): 
    res = [] 
    f = open(file,'r+') 
    reader = csv.reader(f) 
    for i, line in enumerate(reader): 
     if i < 10: 
     res.append((line[0],int(line[1]),int(line[2]))) 

     res.sort(key= lambda x: x[2]) 

    max = res[-1] 
    min = res[0] 

    print max 
    print min 
+0

对于它的价值,'key = lambda x:x [2]'可以用'operator.itemgetter(2)'代替。另外'对于我,在列举行(读者):如果我<10:'用于行itertools.islice(读者,10):'。 –

+0

如果你只使用前10行,你为什么要迭代整个CVS?当'i'达到10时'break'。另外,为什么在每个'append'之后对'res'进行排序,为什么不在最后一次呢? –

回答

0

在输出数据中有两种排序。一个是每行中的项目顺序,另一个是行的顺序。

每一行中的项目的顺序由线

res.append((. . .

控制要修改此顺序,只是改变这一行的子表达式的顺序。

要修改行的顺序,一个非常好的方法是重复排序。先按最不重要的标准排序,然后按最重要的标准排序。

如果要按每行的元素0进行排序,通过元素1的值打破关系,并通过元素2的值打破任何剩余关系,则在代码中有三行排序,而不仅仅是1行例如:

res.sort(key= lambda x: x[2]) 
res.sort(key= lambda x: x[1]) 
res.sort(key= lambda x: x[0]) 

或一些等同物。 Python排序是“稳定的”,因此,例如,如果最终排序的键相同,则最后的排序步骤会保留现有的排序。

+0

为什么要这样分三次,而不是一次使用多值(元组)键? –

+0

@Cristian元组键可能是更复杂的方法。在我看来,为了获得最佳性能,您希望将密钥添加到数据集中的每个记录,然后进行排序,然后只提取所需的数据。这似乎更容易解释,而且在Terr的情况下表现似乎是一个关键目标似乎令人怀疑。 –