在Python3.x中对文本文件的内容进行排序

在Python3.x中对文本文件的内容进行排序,python,python-3.x,text,Python,Python 3.x,Text,我想对包含以下内容的文本文件进行排序 线条像 1000S 00RR: 20 values 1200S -10RR: 10 values 900S -20RR: 6 values 150S -05RR: 4 values 10000S 00RR: 2 values 我想将其排序为(按升序,考虑空间数值之前的第一个元素) 我想知道什么是更好的实施方法 我尝试了以下方法: with open(file_name, "r") as file_name_opened: lines = file_

我想对包含以下内容的文本文件进行排序 线条像

1000S 00RR: 20 values
1200S -10RR: 10 values
900S -20RR: 6 values
150S -05RR: 4 values
10000S 00RR: 2 values
我想将其排序为(按升序,考虑空间数值之前的第一个元素)

我想知道什么是更好的实施方法

我尝试了以下方法:

with open(file_name, "r") as file_name_opened:
    lines = file_name_opened.readlines()
    for x in range(0,20):
        try:
            list_one.append(lines[x])
        except IndexError:
            pass

return sorted(list_one)
print("sorted: " + str(sorted(list_one)))

如果知道是否有更好的方法,那就太好了…

打开的文件是一个以“\n”结尾的字符串的iterable。在开发代码以将打开的文件作为iterable进行处理时,可以在代码本身中定义这样的iterable。这可以通过多行字符串文字和拆分行来完成,如下所示。这使得读者可以发布自己可以执行的代码,而无需创建和稍后删除单独的文件

排序的关键问题是定义关键函数。根据您的示例,您希望每行的整数值达到“S”。因此,您需要对“S”进行微调,将前面的数字拆分,然后将数字子字符串转换为int

data = '''\
1000S 00RR: 20 values
1200S -10RR: 10 values
900S -20RR: 6 values
150S -05RR: 4 values
10000S 00RR: 2 values
'''.splitlines(keepends=True)

def keyfunc(line):
    return int(line[:line.index('S')])
test_int = keyfunc("1000S 00RR: 20 values")  # for testing only
print(type(test_int), test_int)
# <class 'int'> 1000

out = sorted(data, key=keyfunc)
for line in out: print(line, end='')
data=''\
1000S 00RR:20个值
1200S-10RR:10个值
900S-20RR:6个值
150S-05RR:4个值
10000000RR:2个值
''.splitlines(keepends=True)
def keyfunc(行):
返回int(第[:行索引('S')]))
test_int=keyfunc(“1000S 00RR:20个值”)#仅用于测试
打印(类型(测试输入),测试输入)
#  1000
out=已排序(数据,键=keyfunc)
对于行输入输出:打印(行,结束=“”)

此代码打印您请求的输出。要将其与文件一起使用,请删除
数据
keyfunc
测试语句,并将
排序的
语句包装为
打开(文件名)作为数据:

您尝试过任何方法来实现它吗?您当前的代码是否存在效率问题?@jornsharpe我已经添加了我为此所做的实现……那么这是否有效?它是否效率低下(您有没有遇到性能问题,并进行了分析以找出原因)?非常感谢这是非常有效的信息。。。。它帮助我更好地理解这个概念!
data = '''\
1000S 00RR: 20 values
1200S -10RR: 10 values
900S -20RR: 6 values
150S -05RR: 4 values
10000S 00RR: 2 values
'''.splitlines(keepends=True)

def keyfunc(line):
    return int(line[:line.index('S')])
test_int = keyfunc("1000S 00RR: 20 values")  # for testing only
print(type(test_int), test_int)
# <class 'int'> 1000

out = sorted(data, key=keyfunc)
for line in out: print(line, end='')