【问题标题】:Howto sort alphanumerical values (a1,a2,a3,...) in a CSV line after line with Python如何使用Python逐行对CSV中的字母数字值(a1,a2,a3,...)进行排序
【发布时间】:2014-08-06 09:12:14
【问题描述】:

我有一个完整的 CSV 文件,其中包含以下内容:

L4,B4
B3,C3,B2
B2,A1,C9,F3
F1,E1
F3,E4,I9,A2,F1
K4

我想得到的是:

B4,L4
B2,B3,C3
A1,B2,C9,F3
E1,F1
A2,E4,F1,F3,I9
K4

因此,目标是以字母数字方式对其进行排序 - 用于一行中的所有元素。每行的条目数不一致一致!

我已经尝试使用 libreoffice 对其进行排序(使用从左到右排序),但我无法让它工作。还查看了 python 来完成这项工作,但没有成功。

有什么想法可以让我对这些东西进行排序 - 最好是使用 Python 吗?

感谢您的帮助! 谢谢!

【问题讨论】:

    标签: python sorting csv


    【解决方案1】:
    with open('file.txt') as f:                        
        for line in f:                                 
            print ",".join(sorted(line.rstrip().split(',')))
    

    输出

    B4,L4
    B2,B3,C3
    A1,B2,C9,F3
    E1,F1
    A2,E4,F1,F3,I9
    K4
    

    【讨论】:

    • 感谢您的快速回答 - 这个版本最适合我。如果您有时间,最好能简短地描述一下上面的代码是如何工作的。谢谢!
    【解决方案2】:
    for line in file.read().split('\n'):
        l = line.split(',')
        l.sort()
    

    然后将其写入另一个文件,或随心所欲地使用它。

    【讨论】:

      【解决方案3】:

      试试这个

      file_name = open('i_c.csv','rb')
      for line in file_name:
          if line != '\n':
              print ",".join(sorted(line.strip().split(',')))
      

      【讨论】:

        【解决方案4】:

        @Ashoka Lella 提供的答案很好,但并不完整。

        假设我们拥有与您提供的相同的文件样本,但略有不同:

        L4,B4
        B3,C3,B2
        B2,A1,C9,F3,A10,A2
        F1,E1
        F3,E4,I9,A2,F1
        K4
        

        要明确一点:文件是相同的,除了第三行B2,A1,C9,F3,A10,A2,我在其中添加了A10 和A2。现在,如果您按照上面接受的答案运行它,第三行的结果将是:

        A1,A10,A2,B2,C9,F3
        

        这不是人类对列表进行排序的方式(A2 应该在 A10 之前,因为 2alphanum sorting algorithm 及其implementation in Python 的原因。因此,在您在排序中实现字母数字键选项后 - 排序将以人类期望的方式执行。有了这个,而不是像这样的结果(当您查看它时,这并不是真正的排序):

        A1,A10,A2,B2,C9,F3
        

        你会有更好的答案:

        A1,A2,A10,B2,C9,F3
        

        这是 Ashoka 代码的增强版:

        import re
        
        convert = lambda text: int(text) if text.isdigit() else text
        alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
        
        with open('file.txt') as f:
            for line in f:
                print ",".join(sorted(line.rstrip().split(','), key = alphanum_key))
        

        【讨论】:

          猜你喜欢
          • 2020-07-09
          • 2023-01-09
          • 1970-01-01
          • 1970-01-01
          • 2012-01-27
          • 2015-10-14
          • 2019-07-01
          • 2023-03-06
          • 1970-01-01
          相关资源
          最近更新 更多