假设我有以下列表:
initial_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
我想将其转换为以下内容:
desired_list = [[1, 1, 1, 2, 2, 2, 3, 3, 3], [4, 4, 4, 5, 5, 5, 6, 6, 6], [7, 7, 7, 8, 8, 8, 9, 9, 9]]
如果我不关心订单,我可以做类似的事情
new_list = [sorted(x*3) for x in initial_list]
但是,顺序应与initial_list
中的顺序相同。我能做的最好的事情是将每个元素放在一个列表中,并将其乘以3(任意数字),然后加入结果inner_list
s:
multiplied_list = [[[element]*3 for element in inner_list] for inner_list in initial_list]
desired_list = [[element for element_list in inner_list for element in element_list] for inner_list in multiplied_list]
(在两个人的理解清单中)
是否有更容易理解/适当/ pythonic的方法来执行此操作?
您可以仅使用以下列表理解。请注意,我的initial_list
与OP中的那个不同,以证明保留了顺序。
>>> initial_list = [[1, 3, 2], [4, 5, 6], [7, 8, 9]]
>>> [[x for x in sl for _ in range(3)] for sl in initial_list]
[[1, 1, 1, 3, 3, 3, 2, 2, 2],
[4, 4, 4, 5, 5, 5, 6, 6, 6],
[7, 7, 7, 8, 8, 8, 9, 9, 9]]
或者,在示例中将键添加到排序的函数中:
>>> [sorted(x*3, key=x.index) for x in initial_list]
[[1, 1, 1, 3, 3, 3, 2, 2, 2],
[4, 4, 4, 5, 5, 5, 6, 6, 6],
[7, 7, 7, 8, 8, 8, 9, 9, 9]]
与1000*1000
列表的时间比较:
>>> initial_list = [[i for i in range(1000)] for j in range(1000)]
>>> for sl in initial_list:
... random.shuffle(sl)
>>> %timeit [[x for x in sl for _ in range(3)] for sl in initial_list]
296 ms ± 4.58 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
>>> %timeit [sorted(x*3, key=x.index) for x in initial_list]
23.5 s ± 481 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
所以第一种方法肯定更可扩展!
numpy它和1行代码:
arr=np.array(initial_list)
arr.repeat(3).reshape(3,-1)
输出:
Out[44]:
array([[1, 1, 1, 2, 2, 2, 3, 3, 3],
[4, 4, 4, 5, 5, 5, 6, 6, 6],
[7, 7, 7, 8, 8, 8, 9, 9, 9]])
这是一个使用2 for循环的简单示例:
for l in initial_list:
for j in range(0, 3*len(l), 3):
l[j: j + 1] = [l[j]] * 3