您好,我有一个排序列表['a','b','c','d','e','f']
,当前以矩阵的形式显示在前端
['a','c','e'],
['b,'d','f'],
何时应该
['a','b','c'],
['d,'e','f'],
不幸的是,我无法修改前端以水平显示对象,因此我希望能够以正确的顺序['a','d','b','e','c',f']
将1d数组重新排列为另一个1d数组。
从概念上讲,我知道如何将1d数组转换为2d数组,然后旋转矩阵,然后将2d数组转换回1d数组。但是,我想知道是否有更pythonic的方式/更快的通用算法来实现这一目标。
答案 0 :(得分:2)
通过切片来跨越它
for x, a, b, c, y in dataB:
tree = dictA.get((a, b, c))
if tree:
d, e, fs = tree.search(y)
if f:
for f in fs:
yield x, f
如果需要将其推广到任意维度,请考虑使用numpy:
>>> L = ['a','b','c','d','e','f']
>>> [*L[0::3], *L[1::3], *L[2::3]]
['a', 'd', 'b', 'e', 'c', 'f']
答案 1 :(得分:1)
numpy
考虑到您正在谈论的是GUI,并且GUI倾向于更改大小,我认为最有效的方法是使用numpy
来实施您自己的建议:
a = np.array(['a','b','c','d','e','f'])
n = len(a)
a.reshape(2, int(n)/2).T.reshape(1,n)
输出为:
array([['a', 'd', 'b', 'e', 'c', 'f']], dtype='<U1')
使用答案wim中的解决方案:
%timeit [*L[0::3], *L[1::3], *L[2::3]]
>>> 559 ns ± 18 ns per loop
%timeit np.array(L).reshape(2,3).T.reshape(1,6).tolist()
>>> 5.01 µs ± 257 ns per loop
a = np.array(L)
%timeit L.reshape(2,3).T.reshape(1,6)
>>> 1.58 µs ± 84.1 ns per loop
n = int(len(L)/2)
%timeit [j for i in range(n) for j in L[i::n]]
>>> 1.31 µs ± 73.3 ns
对于恒定大小,似乎wim最好是切片,然后在事先不知道大小的情况下用列表理解切片。