展开具有相同元素的列表

问题描述 投票:2回答:3

假设我有以下列表:

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的方法来执行此操作?

python list list-comprehension nested-lists
3个回答
3
投票

您可以仅使用以下列表理解。请注意,我的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)

所以第一种方法肯定更可扩展!


1
投票

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]])

0
投票

这是一个使用2 for循环的简单示例:

for l in initial_list:
    for j in range(0, 3*len(l), 3):
        l[j: j + 1] = [l[j]] * 3
© www.soinside.com 2019 - 2024. All rights reserved.