3

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

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

4 回答 4

5

sortand函数支持一个 key 参数,sorted它允许您指定应该用于执行排序的键。由于您需要数字排序顺序而不需要字母排序顺序,因此您需要提取第一列并将其转换为 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)
于 2013-01-29T20:19:40.500 回答
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])))
于 2013-01-29T20:19:24.340 回答
1

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

其次,列表中的项目不是整数;它们是字符串。您可以从您使用创建列表的事实中看出这一点,该列表readlines()返回一个字符串数组。当您对字符串进行排序时,它们默认按字母顺序排序。这就是为什么在您的示例中它们似乎按“仅第一位”排序的原因。

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

于 2013-01-29T20:26:06.967 回答
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)
于 2013-01-29T20:22:54.863 回答