sorted()只按首位数字排序
我需要对一个表格的第一列进行排序。这个表格大概是这样的:
6000 799
7000 352
8000 345
9000 234
10000 45536
11000 3436
1000 342
2000 123
3000 1235
4000 234
5000 233
我想让第一列按从小到大的顺序排列,但现在它只根据第一位数字来排序,而不是整列的值,也就是说:
1000 342
10000 45536
11000 3436
2000 123
但我想要的是:
1000 342
2000 123
3000 1235
etc
目前我正在尝试:
SortInputfile=open("InterpBerg1","r")
line=SortInputfile.readlines()
line.sort()
map(SortOutputfile.write, line)
4 个回答
首先,你需要知道在Python中有两种标准的排序列表的方法。第一种是 sorted()
,这是一个通用的内置函数,它接受一个列表并返回一个排序后的副本;第二种是 .sort()
,这是一个专门针对列表的内置方法,它会直接对这个列表进行排序(并返回 None
)。你使用的是 .sort()
,而不是 .sorted()
。
其次,你列表中的项目并不是整数,而是字符串。你可以通过使用 readlines()
创建列表来判断这一点,因为它返回的是字符串数组。当你对字符串进行排序时,默认是按字母顺序排序的。这就是为什么在你的例子中,它们看起来是按“首个字符”排序的原因。
如果你想按其他标准排序,有两个选项,这两个选项都是通过关键字参数传递给 sorted()
函数和 .sort()
方法的。第一个,正如其他一些回答中提到的,是 key
参数,它大致定义了你想用来排序的列表项的某个特征;在你的情况下,你想用第一个数字的值来排序。你可以通过用空格分割字符串,取第一个部分,然后转换成整数来实现这一点。(Lev Levitsky 和 bikeshedder 的回答都展示了合适的方法来做到这一点)。传递给 key
的值必须是一个函数(可以是标准函数或lambda函数),它接受列表项作为输入并返回你想要的值。另一个可以使用的参数是 cmp
参数,这是一个函数,它接受两个列表项(或者它们的键,如果你也定义了 key
参数)作为输入,并返回一个值来指示哪个项目“更大”。这个功能稍微复杂一些,但它为你的排序增加了更多灵活性。
对于数字排序,你应该把字符串转换成数字。要做到这一点,可以使用 key
参数来实时处理:
outfile.writelines(sorted(
open('InterpBerg1'),
key = lambda l: int(l.split(maxsplit=1)[0])))
补充:我同意其他人建议在处理文件时使用 with
语句,所以:
with open('Output', 'w') as outfile, open('InterpBerg1') as infile:
outfile.writelines(sorted(infile,
key = lambda l: int(l.split(maxsplit=1)[0])))
sort
和sorted
这两个函数都有一个叫做key的参数,允许你指定用来排序的关键字。如果你想按照数字的顺序来排序,而不是字母的顺序,就需要提取第一列的数据,并把它转换成整数(int):
SortInputfile=open("InterpBerg1","r")
line=SortInputfile.readlines()
line.sort(key=lambda line: int(line.split()[0]))
map(SortOutputfile.write, line)
一个更简洁的写法可以是:
# read input file
with open(input_filename) as fh:
lines = fh.readlines()
# sort lines
lines.sort(key=lambda line: int(line.split()[0]))
# write output file
with open(output_filename, 'w') as fh:
fh.writelines(lines)