Python列表排序反向顺序

时间:2018-08-18 22:08:22

标签: python list sorting sortedlist

我正在尝试根据最高值创建某种计分板。我添加了reverse = true标志,但它仍然按升序而不是降序打印。我尝试过更改代码以也使用sort()方法,但似乎不起作用。

def sort(results):
import csv
import operator

sort = open(results,'r')
newsort = sorted(sort,key=operator.itemgetter(1), reverse = True)

for eachline in newsort:
    print (eachline)

鲍勃,5,记忆

血液,1,记忆

糖果,5,记忆

Candy,4,memory

Candice,1,内存

Candybdjf,5,内存

即使我已要求按索引1进行排序,打印的内容是什么?

2 个答案:

答案 0 :(得分:2)

修改后的代码存在的问题是,您实际上并没有以CSV格式读取文件:

std::pair<std::pair<int,int>, int>

这是将每一行作为字符串排序。这意味着sort = open(results,'r') newsort = sorted(sort,key=operator.itemgetter(1), reverse = True) 正在该字符串中获取字符#1。因此,因为itemgetter(1),这就是事物的排序方式。

如果您想将文件读取为CSV文件,则不能仅'o' > 'l' > 'a' CSV模块,而必须使用它:

import

现在,您要对第1列而不是字符#1进行排序:sort = open(results,'r') rows = csv.reader(sort) newsort = sorted(rows,key=operator.itemgetter(1), reverse = True)


但是,如果第二列打算按数字进行排序,那么例如'5' > '4' > '1',则需要做更多的工作。因为这些列是字符串,而10 > 2是字符串。

如果您想将这些值实际用作数字,则需要在阅读它们时进行转换:

'10' < '2'

如果您只需要将它们作为数字进行排序,则可以更简单一些:

sort = open(results,'r')
rows = ((name, int(num), thing) for (name, num, thing) in csv.reader(sort))
newsort = sorted(rows,key=operator.itemgetter(1), reverse = True)

如果您不理解上面的生成器表达式:

sort = open(results,'r')
rows = csv.reader(sort)
newsort = sorted(rows, key=lambda: int(row[1]), reverse = True)

...我们可以分解它。

首先,生成器表达式只是列表理解的一个懒惰版本-它产生相同的值,但它是按需产生的,而不是构建它们的列表。等效的列表理解是一回事,但带有方括号:

rows = ((name, int(num), thing) for (name, num, thing) in csv.reader(sort))

如果您以前从未看过理解,那可能很难理解。但是您可以将任何列表理解变成围绕rows = [(name, int(num), thing) for (name, num, thing) in csv.reader(sort)] 的显式循环:

append

如果仍然不清楚,让我们进一步分解:

rows = []
for (name, num, thing) in csv.reader(sort):
    rows.append((name, int(num), thing))

答案 1 :(得分:0)

我认为您想要这样的东西(假设您的第二列名称为“ Idx”):

with open('test.csv', 'r') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in sorted(reader, key=operator.itemgetter('Idx'), reverse=True):
        print(row)

输出:

OrderedDict([('Name', 'Bob'), ('Idx', '5'), ('Memory', 'memory')])
OrderedDict([('Name', 'candy'), ('Idx', '5'), ('Memory', 'memory')])
OrderedDict([('Name', 'Candy'), ('Idx', '4'), ('Memory', 'memory')])

如果您不想使用csv阅读器,可以尝试以下操作:

with open('test.csv', 'r') as csvfile:
    for row in sorted(csvfile, key=lambda x: x.split(',')[1], reverse=True):
        print(row)

输出:

Bob,5,memory
candy,5,memory
Candy,4,memory