簡體   English   中英

如何轉置列表列表?

[英]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)

現在,問題是:

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

  2. 如果我們有一個包含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))

示例 1

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

tuple(zip(*l))
(('a1', 'b1', 'c1'), 
 ('a2', 'b2', 'c2'))

示例 2

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'))

解釋

  1. 解包運算符允許您將列表解包到子列表中,並將它們作為單獨的參數傳遞給zip ,正如它所期望的那樣。
  2. zip將每個子列表的第一個、第二個、第三個...第 n 個元素組合成 n 個元組 object

在此處輸入圖像描述

  1. 元組將這個 zip object 轉換為整體 zip 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM