0

我有一个包含一些数据行的 CSV 文件,如果我用 Python 打印这些数据,将如下所示:

['1', 'George Washington', '1789-04-30', '1797-03-04', 'Independent ', 'Virginia']
['2', 'John Adams', '1797-03-04', '1801-03-04', 'Federalist ', 'Massachusetts']
['3', 'Thomas Jefferson', '1801-03-04', '1809-03-04', 'Democratic-Republican ', 'Virginia']
['4', 'James Madison', '1809-03-04', '1817-03-04', 'Democratic-Republican ', 'Virginia']

我需要再次打印这 4 行,但这次按第二个元素排序。我试过这段代码:

import csv
csvdata=csv.reader(file('presidents.csv'))
for i in csvdata:
    i[1].sort()
    print i

但它不起作用。

4

2 回答 2

4

首先,您应该使用open而不是file. 要对某物进行排序,您需要给它一个要排序的东西的集合;试试这个版本:

with open('presidents.csv') as f:
   csvdata = csv.reader(f)
   rows = list(csvdata)

# sort the rows in-place

rows.sort(key=lambda x: x[1])

print rows

您需要提供自定义key查找,这是内联函数 lambda 所做的。它基本上告诉排序函数使用每个内部列表的第二个元素对外部列表进行排序。

请记住,这sort()是一个就地排序,这意味着它不会返回排序列表 - 事实上,它会返回None,当你尝试这个时会导致惊喜:

rows = rows.sort(key=lambda x: x[1])

现在rowsNone。如果您想将未排序列表和已排序列表分开,请使用sorted(),但请确保分配结果 - 如下所示:

sorted_rows = sorted(rows, key=lambda x: x[1]))
于 2013-03-17T21:17:18.117 回答
1

Errrrm 看起来您正在尝试对字符串进行排序 ^_^ 来自此处的文档:http: //docs.python.org/2/library/csv.html

当您遍历 csvreader 时,您一次获得一行...所以当您说 i[1].sort() i[1] = '1' (csv 第一行中的第一个值)

所以试试这个:

import csv
fh = open('presidents.csv','rt')
csvdata=csv.reader(fh)
for row in csvdata:
    row.sort()
    print row

编辑——刚刚注意到文件的事情:P

于 2013-03-17T21:19:49.503 回答