Python - 用数字排序字符串

时间:2018-04-18 08:59:50

标签: python string python-3.x function sorting

我正在使用python将两个文件合并在一起创建一个新文件,两个文件中的数据在每个字符串的开头都有一个id我想要排序,所以它们的顺序相同,可以是合并。为此,我使用了.sort(),以便它们按照相同的顺序排列,并且注释与细节相匹配。但是,我现在想重新排序它们,以便它们分别为1,2,3,4 ......而不是1,10,100,1000,1001,1002等,但我遇到了困难,因为这个数字是开头的字符串和python不会将字符串的前四个字符转换为整数。如果有任何帮助,它也是制表符分隔文件,id后面的下一条信息就是日期。

任何想法都会受到赞赏,理想情况下我不想导入任何库。

我的代码是:

comments = R'C:\Pythonfile\UFOGB_Comments.txt'
details = R'C:\Pythonfile\UFOGB_Details.txt'
mydest = R'C:\Pythonfile\UFOGB_sorted.txt'

with open(details,'rt') as src:
    readdetails = src.readlines()
    readdetails.sort()

with open(comments,'rt') as src:
    readcomments = src.readlines()
    readcomments.sort()

with open(mydest, 'w') as dest:
    for i in range(len(readdetails)):
        cutcomm = readcomments[i][readcomments[i].find('"'):]
        dest.write('{}\t{}'.format(readdetails[i].strip('\n'),cutcomm))

3 个答案:

答案 0 :(得分:1)

您可以尝试将第一个字段解析为int:

readdetails.sort(key=lambda x: int(x.split()[0]))

如果所有行都采用一致的格式,这将很有效。

否则使用更复杂的函数作为list.sort()的关键函数,例如:

def extract_id(line):
    # do something with line
    # and return an integer, or another kind of value

并将其传递给sort函数:

readdetails.sort(key=extract_id)

答案 1 :(得分:0)

我尝试根据您的解释重新创建数据。告诉我这是否正确:

lines = """
123   foobar
1000  foobar
432   foobar
22    foobar
987   foobar
""".strip().split('\n')

print(lines)
lines.sort(key=lambda s: int(s[:4]))
print(lines)

结果:

['123   foobar', '1000  foobar', '432   foobar', '22    foobar', '987   foobar'] # initial
['22    foobar', '123   foobar', '432   foobar', '987   foobar', '1000  foobar'] # final

我认为您的整数id限制为4位,正如您在OP中所说的那样。如果id大小是可变的,您可以简单地替换排序函数:

lines.sort(key=lambda s: int(s.split()[0]))

答案 2 :(得分:0)

如果您的困难与按每个条目的前四个字符对列表排序有关,请尝试https://wiki.python.org/moin/HowTo/Sorting中的此方法:

with open(details,'rt') as src:
    read_details = src.readlines()
    read_details = sorted(read_details, key=lambda detail: detail[:4])

with open(comments,'rt') as src:
    read_comments = src.readlines()
    read_comments = sorted(read_comments, key=lambda comment: comment[:4])

我并不完全确定您在最后一部分中尝试实现的目标 - 您在评论和详细信息文件中所拥有的示例,其中包含您希望条目看起来像什么的示例目的地将是有用的。