【问题标题】:How to sort alphanumeric lists, by highest to lowest (Python)如何按从高到低对字母数字列表进行排序(Python)
【发布时间】:2015-08-22 04:54:00
【问题描述】:

在我的程序中,Python 打开一个 CSV Excel 文件并读取它。该文件包含字母数字数据,在 Excel 文件中分为三个不同的单元格。然后程序将数据列成一个列表。

程序应按数字数据从高到低对列表进行排序。 但我一直无法找到解决方案。

到目前为止我有:

def highlow ():
    file = open("Thisfile.csv", "r" )
    read = file.readlines ()
    list(read)

我试过了:

read.sort ()

但是当我打印“阅读”时,我得到的只是:

['ANDERSON,Jane,7\n', 'BIRCH,Darren,9\n', 'MCKOLEEP,Philip,6\n', 'SMITH,Richard,3\n']

相反,我希望列表按每个项目中的整数排序,而不是按字母顺序。

【问题讨论】:

    标签: python sorting csv


    【解决方案1】:

    首先使用 csv module 读取 CSV,这将为您提供正确分隔的值:

    import csv
    
    with open("Thisfile.csv", "rb") as file:
        reader = csv.reader(file)
        rows = [r[:-1] + [int(r[-1])] for r in reader]
    
    rows.sort(key=lambda r: r[-1])
    

    rows = [...] 行使用list comprehension 在读取 CSV 文件时将最后一列转换为整数对象。

    将行作为单独的列表,排序就变得相对简单了;只需排序或最后一列,这就是 key=lambda r: r[-1] 位所做的。

    演示:

    >>> import csv
    >>> demodata = '''\
    ... ANDERSON,Jane,7
    ... BIRCH,Darren,9
    ... MCKOLEEP,Philip,6
    ... SMITH,Richard,3
    ... '''
    >>> reader = csv.reader(demodata.splitlines(True))
    >>> rows = [r[:-1] + [int(r[-1])] for r in reader]
    >>> rows.sort(key=lambda r: r[-1])
    >>> for row in rows:
    ...     print row
    ... 
    ['SMITH', 'Richard', 3]
    ['MCKOLEEP', 'Philip', 6]
    ['ANDERSON', 'Jane', 7]
    ['BIRCH', 'Darren', 9]
    

    【讨论】:

      【解决方案2】:

      你可以这样使用:

      read = sorted(read, key=lambda data: data.replace('\n', '').split(',', 3)[2])
      

      【讨论】:

        【解决方案3】:

        您可以尝试使用operator.itemgetter(),它非常直观。

        import csv
        from operator import itemgetter
        
        rows = []
        
        with open("Thisfile.csv", "rb") as f:
            csv_reader = csv.reader(f1)
            for row in csv_reader:
                rows.append(row)
        
        # This sorts by column #2 in descending order:
        sorted_rows = sorted(rows, key=itemgetter(2), reverse=True)
        
        >>>
        [['BIRCH', 'Darren', '9'],
         ['ANDERSON', 'Jane', '7'],
         ['MCKOLEEP', 'Philip', '6'],
         ['SMITH', 'Richard', '3']]
        

        您还可以将最后一行更改为:

        rows.sort(key=itemgetter(2), reverse=True)
        

        补充: 如果您在最后一列中有重复的数值,您还可以方便地进行二次排序,例如您可以在按数值排序后按姓氏排序。例如。如果您在 csv 中有以下行:

        ANDERSON,Jane,7
        BIRCH,Darren,9
        MCKOLEEP,Philip,6
        SMITH,Richard,3
        WELSH,John,3
        

        然后您可以使用以下行进行排序:

        sorted_rows = sorted(rows, key=itemgetter(2,0), reverse=True)
        

        首先按第 2 列排序,然后再按第 0 列排序,全部按降序排列,输出如下:

        [['BIRCH', 'Darren', '9'],
         ['ANDERSON', 'Jane', '7'],
         ['MCKOLEEP', 'Philip', '6'],
         ['WELSH', 'John', '3'],
         ['SMITH', 'Richard', '3']]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-03
          • 1970-01-01
          • 1970-01-01
          • 2016-01-26
          • 2018-04-09
          相关资源
          最近更新 更多