【问题标题】:How can I sort multiple Python lists based on the sort applied to one list?如何根据应用于一个列表的排序对多个 Python 列表进行排序?
【发布时间】:2026-02-15 23:45:01
【问题描述】:

我有一个 Python 中的列表列表,它们基本上代表一个表。我知道我应该使用 pandas 数据框来完成此任务,但事后看来是 20/20。我离题了...下面是我正在谈论的示例列表。

总体列表变量由以下嵌套列表组成:

['Store number', 2, 3, 4, 1, 5]
['Variable 1', 82, 99, 44, 32, 65]
['String 1', 'cat', 'dog', 'lizard', 'alligator', 'crocodile']

在当前状态下,每个嵌套列表的每个索引对应表中的同一行。所以对于 2 号商店,变量 1 是 82,字符串 1 是 cat。假设我想将每个列表排序到维护这些关系的位置,但我们按商店编号升序排序。最终列表如下所示:

['Store number', 1, 2, 3, 4, 5]
['Variable 1', 32, 82, 99, 44, 65]
['String 1', 'alligator', 'cat', 'dog', 'lizard', 'crocodile']

我如何使用我当前的数据结构来实现这一点?

【问题讨论】:

    标签: python-3.x list sorting


    【解决方案1】:

    您可以根据其中一个列表中的值对来自range 的索引列表进行排序。然后你可以使用索引重新排序原来的三个列表:

    store = ['Store number', 2, 3, 4, 1, 5]
    var1 = ['Variable 1', 82, 99, 44, 32, 65]
    str1 = ['String 1', 'cat', 'dog', 'lizard', 'alligator', 'crocodile']
    
    sort_indexes = sorted(range(1, len(store)), key=lambda i:store[i])
    
    store[1:] = [store[i] for i in sort_indexes]
    var1[1:] = [var1[i] for i in sort_indexes]
    str1[1:] = [str1[i] for i in sort_indexes]
    

    如果每列的标题不包含在同一个列表中,您的数据结构会更好地使用。但这种尴尬实际上并没有对这段代码产生太大影响,因为无论如何我们并不是直接对列表进行排序,而是对索引进行排序,并且从索引1 而不是0 开始这样做并没有任何问题。如果您将标头从数据中移出,您就可以跳过这段代码末尾的切片分配(直接使用列表推导值)。

    【讨论】:

      【解决方案2】:

      如果您必须使用当前的数据结构,这里有一个函数可以满足您的需求。请注意,可能还有更聪明的方法,但这会奏效。

      给定:

      lolists = [['Store number', 2, 3, 4, 1, 5],
                  ['Variable 1', 82, 99, 44, 32, 65],
                  ['String 1', 'cat', 'dog', 'lizard', 'alligator', 'crocodile']      
                  ]
      def sortinnerLists(lol):
          kys = lol[0][1:]
          sortedKys = sorted(kys)
          rslt = [[lol[0][0]], [lol[1][0]], [lol[2][0]]]
          for v in sortedKys:
              indx = kys.index(v)+1
              rslt[0].append(v)
              rslt[1].append(lol[1][indx])
              rslt[2].append(lol[2][indx])
          return rslt    
      sortinnerLists(lolists)  
      

      产量:

      [['Store number', 1, 2, 3, 4, 5],
       ['Variable 1', 32, 82, 99, 44, 65],
       ['String 1', 'alligator', 'cat', 'dog', 'lizard', 'crocodile']]
      

      【讨论】:

        最近更新 更多