如何转置列表列表?

Shc*_*mna 3 python transpose tuples list nested-lists

ll为列表的列表,tt元组的元组

输入:ll =[["a1","a2"],["b1","b2"],["c1","c2"]]

期望的输出: tt =(("a1","b1","c1"),("a2","b2","c2"))

我已经设法解决了一个二元素列表的问题,这意味着内部列表每个只包含两个元素。

def list_of_list_to_tuple_of_tuple(ll):
    first_elements = [i[0] for i in ll]
    second_elements = [i[1] for i in ll]
    
    new_list = []
    new_list.append(tuple(first_elements))
    new_list.append(tuple(second_elements))
    return tuple(new_list)

ll = [["a1","a2"],["b1","b2"],["c1","c2"]]
list_of_list_to_tuple_of_tuple(ll)
Run Code Online (Sandbox Code Playgroud)

现在,问题是:

  1. 有没有其他方法可以轻松完成我所做的事情?

  2. 如果我们有一个包含3 个内部列表且每个内部列表包含 n 个元素的列表,是否有任何方法可以轻松推广该算法?例如:

输入: ll =[["a1","a2","a3",..."an"],["b1","b2","b3",..."bn"],["c1","c2","c3",..."cn"]]

期望的输出: tt =(("a1","b1","c1"),("a2","b2","c2"),("a3","b3","c3"),...,("an","bn","cn"))

Aks*_*gal 6

试试这个单行词——

tuple(zip(*l))
Run Code Online (Sandbox Code Playgroud)

实施例1

l = [["a1","a2"],
     ["b1","b2"],
     ["c1","c2"]]

tuple(zip(*l))
Run Code Online (Sandbox Code Playgroud)
(('a1', 'b1', 'c1'), 
 ('a2', 'b2', 'c2'))
Run Code Online (Sandbox Code Playgroud)

实施例2

l2 = [["a1","a2","a3","an"],
      ["b1","b2","b3","bn"],
      ["c1","c2","c3","cn"]]

tuple(zip(*l2))
Run Code Online (Sandbox Code Playgroud)
(('a1', 'b1', 'c1'),
 ('a2', 'b2', 'c2'),
 ('a3', 'b3', 'c3'),
 ('an', 'bn', 'cn'))
Run Code Online (Sandbox Code Playgroud)

解释

  1. 解包运算符允许您将列表解包到子列表中,并将它们作为单独的参数传递给zip,正如它所期望的那样。
  2. zip每个子列表的第一个、第二个、第三个...第n个各自的元素组合成n个元组对象

在此输入图像描述

  1. 元组转换此 zip 对象将整个 zip 对象转换为元组。

奖金

直观上,此操作类似于矩阵的转置。如果将列表列表转换为 numpy 数组然后进行转置,就可以很容易地看出这一点。

import numpy as np

l = [["a1","a2"],["b1","b2"],["c1","c2"]]
arr = np.array(l)
transpose = arr.T
transpose
Run Code Online (Sandbox Code Playgroud)
array([['a1', 'b1', 'c1'],
       ['a2', 'b2', 'c2']], dtype='<U2')
Run Code Online (Sandbox Code Playgroud)