2015-07-20 122 views
0

我在Python中对列表进行排序时遇到了问题。出于某种原因,它确实将列表排列在最高值上,但在该过程完成之后,该列表中的其他元素不再被排序。基于第一个整数对列表进行排序

我的代码:

import csv 

id_list = [] 

with open('source/to/file/output.csv', 'rt') as f: 
    reader = csv.reader(f, delimiter=',', quotechar='"') 
    for row in reader: 
     test = "177" 
     if test == row[0]: 
      id_list.append([row[2],row[1]])    

generated_list = id_list[0], id_list[16], id_list[20] 

print(generated_list) 
print(sorted(generated_list)) 

打印的结果是:

-- (['17', '179'], ['5', '2641'], ['9', '3705']) # not sorted 
-- [['17', '179'], ['5', '2641'], ['9', '3705']] # sorted 

我会想到的是,排序方法将输出:

-- [['17', '179'], ['9', '3705'], ['5', '2641']] # sorted 

我做有问题?

+2

你为什么期待? Python是**强类型**,它不会将字符串视为数字。见例如http://stackoverflow.com/q/4836710/3001761一些替代品。 – jonrsharpe

回答

3

Python的排序将基于第一个元素列表lexicographicaly因为你的字符串,那GET骑使用一键功能进行排序基于int值:

print(sorted(generated_list,key=lambda x:int(x[0]),reverse=True)) 

演示:

>>> sorted(generated_list,key=lambda x:int(x[0]),reverse=True) 
[['17', '179'], ['9', '3705'], ['5', '2641']] 

或者如评论中所述,您可以在排序之前将您的号码转换为整数,也可以将您的行解包以拒绝多重索引:

with open('source/to/file/output.csv', 'rt') as f: 
    reader = csv.reader(f, delimiter=',', quotechar='"') 
    for row in reader: 
     test = "177" 
     row1,row2,row3=row 
     if test == row1: 
      id_list.append([int(row2),row(row1)]) 
+0

哦,那太棒了!非常感谢!这就是诀窍!只要我可以标记你答案,我会做到! – Rotan075

+1

假设OP想要使用该数据,尽管将值永久转换为“int”可能会更好。 –

+0

@tobias_k是的,那会更好! – Kasramvd

相关问题