我是Python的新手。我有一个包含3列的文本文件,第一列包含数字。我想按递增的顺序对这个txt的行进行排序。我试过这个:
lines=[line for line in inputFile if line.strip()]
lines.sort()
但是,文件按非数字方式排序,但按字母顺序排序。例如1,11,12,13,14,... 19,2,21 ......如何解决这个问题?
谢谢。
答案 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)