代码之家  ›  专栏  ›  技术社区  ›  holastello

按另一个列表对嵌套列表排序[重复]

  •  2
  • holastello  · 技术社区  · 6 年前

    我有以下双重嵌套列表:

    records = [[['Jack', 'male', 1],['Jack', 'male', 2],['Jack', 'male', 3]],[['Sally', 'female', 1],['Sally', 'female', 2],['Sally', 'female', 3]]]
    

    我想根据这个列表对这个列表进行排序。。。

    list_order = ['female', 'male']
    

    ……结果是:

    records 
    [[['Sally', 'female', 1],['Sally', 'female', 2],['Sally', 'female', 3]],[['Jack', 'male', 1],['Jack', 'male', 2],['Jack', 'male', 3]]]
    
    2 回复  |  直到 6 年前
        1
  •  0
  •   Ajax1234    6 年前

    你可以用 sum :

    records = [[['Jack', 'male', 1],['Jack', 'male', 2],['Jack', 'male', 3]],[['Sally', 'female', 1],['Sally', 'female', 2],['Sally', 'female', 3]]]
    list_order = ['female', 'male']
    new_records = sorted(records, key=lambda x:sum(list_order.index(i[1]) for i in x))
    

    输出:

    [[['Sally', 'female', 1], ['Sally', 'female', 2], ['Sally', 'female', 3]], [['Jack', 'male', 1], ['Jack', 'male', 2], ['Jack', 'male', 3]]]
    
        2
  •  1
  •   Triggernometry    6 年前

    这可能比你要求的要复杂一点。我假设:

    1. 不能保证每个组只包含一个“列表顺序”类别中的项目

    2. 您希望最终列表是双重嵌套的,所有“列表顺序”类别都分组在一起

    3. 除了与“列表顺序”匹配的一列之外,没有其他顺序
    4. 项目应按“列表顺序”中列出的顺序排列

    因此,您可以使用以下代码:

    记录=[[['Jack','male',1],[Jack','male',2],[Jack','male',3]],[['Sally','female',1],[Sally','female',2],[Sally','female',3]]
    列表顺序=['女性','男性']
    
    #将列表“展平”为单个嵌套列表
    records=[leaf for branch in records for leaf in branch]
    
    #按列表顺序对列表中的项目排序
    #sorted将列表中的每个项传递给lambda函数
    #记录[1]是“男/女”的位置
    记录=已排序(记录,键=lambda记录:list_order.index(记录[1]))
    
    #再次按列表顺序对列表进行分组,创建双重嵌套列表
    records=[[如果记录[1]==item]为列表中的项,则记录中记录的记录]
    
    打印记录
    

    在线试用(带调试打印件)!

    records = [[['Jack', 'male', 1],['Jack', 'male', 2],['Jack', 'male', 3]],[['Sally', 'female', 1],['Sally', 'female', 2],['Sally', 'female', 3]]] list_order = ['female', 'male'] # "flatten" list into singly-nested list records = [leaf for branch in records for leaf in branch] # sort the items in the list by list_order # sorted passes each item in the list to the lambda function # record[1] is the position of "male"/"female" records = sorted(records, key=lambda record: list_order.index(record[1])) # group the list by list_order again, creating doubly-nested list records = [ [record for record in records if record[1] == item ] for item in list_order ] print records

    在线试用(带调试打印件)!