【问题标题】:Python - sorting strings numericallyPython - 以数字方式对字符串进行排序
【发布时间】:2018-09-28 10:37:45
【问题描述】:

我正在使用 python 将两个文件合并在一起以创建一个新文件,两个文件中的数据在我要排序的每个字符串的开头都有一个 id,因此它们的顺序相同并且可以合并。为此,我使用了 .sort() 以便它们都以相同的顺序排列,并且 cmets 匹配细节。但是,我现在想重新排序它们,使它们变为 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))

【问题讨论】:

  • 您能否提供输入文件的简短 sn-p 和相同的预期输出

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


【解决方案1】:

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

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

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

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

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

并将其传递给排序函数:

readdetails.sort(key=extract_id)

【讨论】:

    【解决方案2】:

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

    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]))
    

    【讨论】:

      【解决方案3】:

      如果您的困难涉及按每个条目的前四个字符对列表进行排序,请尝试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])
      

      我不完全确定您在最后一部分中要达到的目标 - 您在 cmets 和详细信息文件中的示例以及您希望条目在目标中的外观示例是有用。

      【讨论】:

        猜你喜欢
        • 2011-11-12
        • 2022-11-25
        • 1970-01-01
        • 2012-11-14
        • 2020-09-16
        • 1970-01-01
        • 2016-06-14
        • 1970-01-01
        相关资源
        最近更新 更多