[英]How to transpose a list of lists?
讓ll是列表的列表,而tt是元組的元組
輸入:ll = [["a1","a2"],["b1","b2"],["c1","c2"]]
所需的 output: 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)
現在,問題是:
有沒有其他方法可以輕松完成我所做的事情?
如果我們有一個包含3 個內部列表且每個內部列表包含 n 個元素的列表,是否有任何方法可以輕松地推廣此算法? 例如:
輸入: ll = [["a1","a2","a3",..."an"],["b1","b2","b3",..."bn"],["c1","c2","c3",..."cn"]]
所需的 Output: tt = (("a1","b1","c1"),("a2","b2","c2"),("a3","b3","c3"),...,("an","bn","cn"))
試試這個單線 -
tuple(zip(*l))
l = [["a1","a2"],
["b1","b2"],
["c1","c2"]]
tuple(zip(*l))
(('a1', 'b1', 'c1'),
('a2', 'b2', 'c2'))
l2 = [["a1","a2","a3","an"],
["b1","b2","b3","bn"],
["c1","c2","c3","cn"]]
tuple(zip(*l2))
(('a1', 'b1', 'c1'),
('a2', 'b2', 'c2'),
('a3', 'b3', 'c3'),
('an', 'bn', 'cn'))
zip
,正如它所期望的那樣。zip
將每個子列表的第一個、第二個、第三個...第 n 個元素組合成 n 個元組 object直觀上,此操作類似於對矩陣進行轉置。 如果將列表列表轉換為 numpy 數組然后進行轉置,則可以很容易地看到這一點。
import numpy as np
l = [["a1","a2"],["b1","b2"],["c1","c2"]]
arr = np.array(l)
transpose = arr.T
transpose
array([['a1', 'b1', 'c1'],
['a2', 'b2', 'c2']], dtype='<U2')
很容易將您的代碼概括為子列表中的兩個以上元素:
ll = [["a1","a2"],["b1","b2"],["c1","c2"]]
first_elements = [x[0] for x in ll]
second_elements = [x[1] for x in ll]
...
kth_elements(k) = [x[k] for x in ll]
現在我們只需要使用列表理解來迭代k
的可能值:
tt = [[x[k] for x in ll] for k in range(len(ll[0]))]
# [['a1', 'b1', 'c1'], ['a2', 'b2', 'c2']]
當然你可以得到tt
作為元組而不是列表:
tt = tuple(tuple(x[k] for x in ll) for k in range(len(ll[0])))
# (('a1', 'b1', 'c1'), ('a2', 'b2', 'c2'))
請注意, python 已經有一個內置的 function 可以同時迭代多個列表, zip
:
tt = tuple(zip(*ll))
# (('a1', 'b1', 'c1'), ('a2', 'b2', 'c2'))
headers = [[] for i in range(1, len(ll[0]) + 1)]
for i in ll:
for e in range(0, len(i)):
headers[e].append(i[e])
res = tuple(tuple(sub) for sub in headers)
print(res)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.