[问题] 请教将List拆掉的方法(转置/平坦化)

楼主: sharkbay (Shark Bay)   2020-01-16 23:41:08
Code : 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))
作者: TuCH (谬客)   2020-01-17 08:41:00
看不太懂 复制?
楼主: sharkbay (Shark Bay)   2020-01-17 10:27:00
发文后才看懂它这个算法是转置+平坦化

Links booklink

Contact Us: admin [ a t ] ucptt.com