根据Python中的第一列对文本文件进行排序

时间:2014-07-17 16:41:54

标签: python sorting python-2.7 text file-io

我是Python的新手。我有一个包含3列的文本文件,第一列包含数字。我想按递增的顺序对这个txt的行进行排序。我试过这个:

lines=[line for line in inputFile if line.strip()]
lines.sort()

但是,文件按非数字方式排序,但按字母顺序排序。例如1,11,12,13,14,... 19,2,21 ......如何解决这个问题?

谢谢。

3 个答案:

答案 0 :(得分:1)

我不知道你的意思是“列”(BTW,如果它是csv或tsv文件,检查标准库中的csv模块),但arknave的评论是正确的答案。一个简单,天真和脆弱的实现(假设以制表符分隔的值):

def convert(line):
    x, y, z = line.strip().split("\t")
    if x.isdigit():
        x = int(x)
    return x, y, z

lines = sorted(convert(line) for line in infile if line.strip())

CAVEAT:这依赖于CPython 2.7的实现细节,并且可能无法按预期使用另一个python版本或实现(AFAIK它将与CPython 3.x打破)。

更强大(但可能更慢)的解决方案:

def mycmp(t1, t2):
    x, y = t1[0], t2[0]
    x_int = x.isdigit()
    y_int = y.isdigit()
    if x_int and y_int:
        x, y = map(int, (x, y))
    if (x_int and y_int) or (not x_int and not y_int):
        return cmp(x, y)
    elif x_int:
        # digits must come before non-digits
        return -1
    else:
        # non-digits must come after digits
        return 1

lines = sorted((line for line in infile if line.strip()), cmp=mycmp)

答案 1 :(得分:0)

它将值解释为字符串,所以19确实是"小于" 2。您可以将它们转换为int,以便按数值对其进行正确排序。

lines=[map(int,line) for line in inputFile if line.strip()]
lines.sort()

或者,如果您不想修改这些值,并希望将它们保留为字符串:

lines.sort(key=lambda i : int(i))

答案 2 :(得分:0)

也可以使用sort函数的key参数:

def get_key(a):
  return [int(x) if x.isdigit() else x for x in a.split('\t')]

lines = sorted((line for line in infile if line.strip()), key=get_key)

编辑:为了解决在字符串之前对int进行排序的实现细节,可以使用以下键函数(但这会导致字符保持未排序):

def get_key(a):
  return [int(x) if x.isdigit() else float('inf') for x in a.split('\t')]

lines = sorted((line for line in infile if line.strip()), key=get_key)