我正在尝试根据最高值创建某种计分板。我添加了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进行排序,打印的内容是什么?
答案 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