sorted()仅按第一个数字排序

时间:2013-01-29 20:15:25

标签: python

我需要对表格的第一列进行排序。它看起来像

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 个答案:

答案 0 :(得分:5)

sortsorted函数支持一个关键参数,允许您指定应该用于执行排序的键。由于您需要数字排序顺序而不需要按字母顺序排序,因此需要提取第一列并将其转换为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)

答案 1 :(得分:2)

对于数字顺序,您应该将字符串转换为数字。要动态执行此操作,请使用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])))

答案 2 :(得分:1)

首先,您应该知道有两种标准方法可以在Python中对列表进行排序。第一个是sorted(),这是一个通用的内置函数,它接受一个列表并返回列表的已排序的副本,第二个是.sort(),这是一个用于对此列表就地进行排序的列表的内置方法(并返回None)。您正在使用.sort();没有.sorted()

其次,列表中的项目不是整数;他们是字符串。您可以通过使用readlines()创建列表的事实来说明这一点,该列表返回一个字符串数组。排序字符串时,默认情况下按字母顺序排序。这就是为什么它们在您的示例中按“仅第一位”排序的原因。

为了按其他方式排序,您有两个选项,两个选项都表示为sorted()函数和.sort()方法的关键字参数。第一个,正如其他几个答案中所提到的那样,是key参数,粗略地说,它定义了您要用于排序的列表项的质量或属性;在您的情况下,您希望使用第一个数字的值。您可以通过用空格分割字符串,获取第一个标记,然后转换为int来获得此结果。 (Lev Levitsky和Bikeshedder的答案都显示了适当的方法)。传递给key的值必须是一个函数(标准函数或lambda函数),它将列表项作为输入并返回所需的值。您可以使用的另一个参数是cmp参数,该参数是一个函数,它将两个列表项(或其键,如果您还定义key参数)作为输入,并返回一个值,指示哪个项目更伟大。”这是一个稍微复杂的功能,但它为您的排序增加了一些灵活性。

答案 3 :(得分:0)

与其他答案相同 - 仅落后几分钟,IMO更具可读性。

lines = []

with open("InterpBerg1","r") as f:
    for line in f:
        lines.append(tuple(int(i) for i in line.split()[:]))

print sorted(lines)