从现有列表中创建一个包含 N 个数字的列表,每个数字重复 K 次

Creating a list of N numbers from existing list each repeated K times

我相信这是一个很容易解决的问题。我已经搜索并找到了一些类似的答案,但不是我想要实现的有效方法。

假设列表如下:

x = [6, 7, 8]

我想通过将每个数字重复 k 次来创建一个新列表。假设k=3,结果应该是:

xr = [6, 6, 6, 7, 7, 7, 8, 8, 8]

我能够使用嵌套循环来完成此操作,但我认为这是非常低效的:

xr = []
for num in x: # for each number in the list
    for t in range(3): # repeat 3 times
        xx2.append(num)

我也试过:

[list(itertools.repeat(x[i], 3)) for i in range(len(x))]

但我得到:

[[6, 6, 6], [7, 7, 7], [8, 8, 8]]

是否有更有效的直接方法来完成此操作?

您可以使用列表理解:

x = [6, 7, 8]
k = 3

out = [v for v in x for _ in range(k)]
print(out)

打印:

[6, 6, 6, 7, 7, 7, 8, 8, 8]
def repeat_k(l,k):
    lo = []
    for x in l:
        for i in range(k):
            lo.append(x)
    return lo

print (repeat_k([1,2,3],5))

输出:

[1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3]

有列表理解:

def repeat_k(l,k):
    return [ x for x in l for i in range(k) ]

print (repeat_k([1,2,3],5))

输出:

[1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3]

另一种可能性:

>>> x = [6, 7, 8]
>>> k = 3
>>> l = []
>>> for item in x:
...     l += k * [item]
...
>>> l
[6, 6, 6, 7, 7, 7, 8, 8, 8]

您可以创建一个方便的函数:

def repeat(it, n):
    for elem in it: yield from [elem] * n

像这样使用它:

>>> list(repeat(x, n=3))
[6, 6, 6, 7, 7, 7, 8, 8, 8]

谢谢大家的解答

似乎有一种更简单、更直接的方法可以使用 Numpy 来解决这个问题。

np.repeat(x, 3).tolist()

打印出我所需要的:

[6, 6, 6, 7, 7, 7, 8, 8, 8]
import itertools
x=[4,5,6]
k=3
res = list(itertools.chain.from_iterable(itertools.repeat(i, K) for i in test_list))
print (res)

也可以使用python itertools 库的内置函数来解决。 repeat 函数执行重复任务,分组到列表中由 from_iterable 函数完成。