作者sharkbay (Shark Bay)
看板Python
标题[问题] 请教将List拆掉的方法
时间Thu Jan 16 23:41:08 2020
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))
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 106.1.34.9 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1579189272.A.4B3.html
※ 编辑: sharkbay (106.1.34.9 台湾), 01/17/2020 06:40:47
1F:推 TuCH: 看不太懂 复制? 01/17 08:41
https://github.com/JasonLiTW/simple-railway-captcha-solver#23-load-the-training-set
我在研究中间这个演算法有没有其他写法
※ 编辑: sharkbay (211.75.195.103 台湾), 01/17/2020 10:20:04
2F:→ sharkbay: 发文後才看懂它这个演算法是转置+平坦化 01/17 10:27