【问题标题】:How to sort a list that contains inner lists by the inner lists in python如何通过python中的内部列表对包含内部列表的列表进行排序
【发布时间】:2020-12-20 19:30:17
【问题描述】:

我有一个包含列表的列表,示例:

table[0] = ['255.255.255.255', '58267', '233', 'ESTABLISHED']
table[1] = ['255.132.0.0', '38367', '273', 'CLOSED']

我想按内部列表对列表'table'进行排序,例如:

我想根据放置在“表”中每个索引中的列表中最后一个索引中的字符串,按字母顺序对“表”进行排序。它看起来像这样:

table[0] = ['255.132.0.0', '38367', '273', 'CLOSED']
table[1] = ['255.255.255.255', '58267', '233', 'ESTABLISHED']

他们改变了位置,因为“C”在“E”之前。

我试过了:

table.sort(key=lambda x: x.sort())

【问题讨论】:

    标签: python python-3.x sorting lis


    【解决方案1】:

    试试这个:

    table.sort(key=lambda x: x[-1])
    
    print(table)
    

    输出:

    [['255.132.0.0', '38367', '273', 'CLOSED'], ['255.255.255.255', '58267', '233', 'ESTABLISHED']]
    

    【讨论】:

    • @Maya 能否请您总结一下解释。我也对它的工作原理感到困惑?
    • 所以我认为代码按照放置在内部列表最后位置的内容对“表”进行排序(x = 内部列表,x[-1] = 内部列表的最后位置)。默认排序是按字母顺序 :)
    【解决方案2】:

    另一种方法是使用numpyargsort() 函数。 它按照排序后的顺序返回索引。

    import numpy as np
    table = [['255.255.255.255', '58267', '233', 'ESTABLISHED'], ['255.132.0.0', '38367', '273', 'CLOSED']]
    
    sorted_indexes = np.argsort([row[-1] for row in table])
    
    sorted_table = np.array(table)[sorted_indexes]
    # as list (and not numpy array):
    sorted_table.tolist()
    
    # [['255.132.0.0', '38367', '273', 'CLOSED'],
    #  ['255.255.255.255', '58267', '233', 'ESTABLISHED']]
    
    

    np.argsort() 的好处是它也适用于 Pandas 数据框:

    import pandas as pd
    df = pd.DataFrame(table)
    
    sorted_indexes = np.argsort(df.iloc[:, -1])
    
    sorted_df = df.iloc[sorted_indexes, :]
    
    sorted_df                                                                                             
    
    #                  0      1    2            3
    # 1      255.132.0.0  38367  273       CLOSED
    # 0  255.255.255.255  58267  233  ESTABLISHED
    
    # you can get numpy arrays by `.values`
    # and from numpy array to normal lists by `.tolist()
    # so:
    
    sorted_df.values.tolist() 
    
    # [['255.132.0.0', '38367', '273', 'CLOSED'],
    #  ['255.255.255.255', '58267', '233', 'ESTABLISHED']]
    

    但 Pandas 当然有内置排序功能:

    df.sort_values(by=[3])
    
    

    您可以为by 提供几个列名或列索引,它们确定排序的优先列值。 使用.values.tolist(),您可以将数据框重新转换回简单列表。

    【讨论】:

    • 哦,我在 python 方面不是很先进哈哈,但谢谢!
    • @Maya 处理表格 - 你应该尽快学习 pandas 数据帧。它会让你的生活更轻松。
    • @Maya 教程在 youtube 中由 Corey Schafer 例如非常适合快速介绍
    • 注意!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 2012-06-28
    • 2021-02-05
    • 2011-05-09
    • 2016-08-30
    相关资源
    最近更新 更多