作者:
sharkbay (Shark Bay)
2020-01-16 23:41:08Code : https://ideone.com/odVysm
# Python 3.7.4 (default, Aug 9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)]
import random
# 產生初值 i j
a = [[[random.choice(range(10)) for _1 in range(3)] for _2 in range(4)] for _3 in range(5)]
# 直觀做法, 先將j拆掉做i次並且複製i個
b = [[]] * len(a[0])
for index in range(len(a[0])): b[index].extend([arr[index] for arr in a])
# 迂迴作法, 先將a[i][j]轉置, 然後用sum拆掉, 再複製i個
c = [sum([[a[j][i] for j in range(len(a))] for i in range(len(a[0]))], [])] * len(a[0])
# 補一個等效C, 只不過用 map zip做轉置
d = [sum([r for r in map(list, zip(*a))], [])] * len(a[0])
(1)想請問除了方法C還有沒有其他做法可以達成List B?
(2)請問2D List轉置/平坦化最快的寫法是哪個?
自問自答: 最終選了這個方法
import itertools
flatten = lambda l : list(itertools.chain(*l))
transpose = lambda l : [flatten(l)[i::len(l[0])] for i in range(len(l[0]))]
e = [flatten(transpose(a))]*len(a[0])
(3) 那反平坦化呢? un1/un2 那個比較好?
un1 = lambda l,n : transpose([l[i::n] for i in range(n)])
x=un1(e[0],len(a))
un2 = lambda l,n : [l[idx:idx+n] for idx in range(0, len(l), n)]
y = un2(e[0],len(a))