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)
现在,问题是:
有没有其他方法可以轻松完成我所做的事情?
如果我们有一个包含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"))
试试这个单行词——
tuple(zip(*l))
Run Code Online (Sandbox Code Playgroud)
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)
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)
zip,正如它所期望的那样。zip每个子列表的第一个、第二个、第三个...第n个各自的元素组合成n个元组对象直观上,此操作类似于矩阵的转置。如果将列表列表转换为 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)