如何在Python中基于一组数字生成一定数量的数字?

4
我应该怎样根据list1创建以下数字列表呢?
list1=[2,1,3]

例如:

list1=[2,1,3]

我想打印:

[1, 1, 2, 3, 3, 3] 
 (2)  (1)   (3) #<-- Ignore this part, I just put it to give you more detail of my question

上面的代码要求打印 两个(1),一个(2) 和 三个(3),因为 list1 = [2,1,3]。有没有在 Python3 中实现的有效方法呢? (- 抱歉,我是 Stack Overflow 的新手,请原谅我的问题表述不够清晰)

6
你有尝试过任何事情吗? - juanpa.arrivillaga
2
我尝试想出一些想法,比如使用for循环生成数字的数量,但不确定如何进一步实现。 - ScarletCoder16
欢迎来到SO。SO是一个专业和热爱编程的人们的问答网站。我们的目标是让您在提问时提供自己的代码,以展示您为解决问题所做的至少一些研究工作。 - Twonky
8个回答

5
这是一种完成此操作的方法:
list1=[2,1,3]
list2 = []
for j, num in enumerate(list1, 1):
    for _ in range(num):
        list2.append(j)

print(list2)

输出:

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

1
@DeepSpace 这个方案有什么效率问题吗?就效率而言,这个解决方案是很好的。它具有线性时间和空间复杂度,这已经是最优的了。 - juanpa.arrivillaga
1
一个改进,不要使用 j = 0j+=,只需使用 for j, num in enumerate(list1, 1): for _ in range(num): list2.append(j) - juanpa.arrivillaga
1
@juanpa.arrivillaga 你是正确的。 - Sheri
3
@Sheri非常感谢您的回答。我理解了代码,它对我非常有效。 - ScarletCoder16

2

已经有很多好的答案了,但是每个像这样的问题都值得使用itertools来回答,所以这是我的解决方案。

>>> a = [2, 1, 3]
>>> from itertools import chain, repeat
>>> list(chain.from_iterable(repeat(i, v) for i, v in enumerate(a, 1)))
[1, 1, 2, 3, 3, 3]

2
可以再进一步:list(chain.from_iterable(starmap(repeat, enumerate(a, 1)))) - Stefan Pochmann

2
您可以使用enumerate()函数:
n = [2, 1, 3]
result = []
for i, j in enumerate(n, start=1):
    result.extend([i] * j)

2
我认为这可以看作是一个按需生成扁平化值的生成器。类似于以下内容:
list1=[2,1,3]

def expandIndices(l):
    for i, n in enumerate(l,1):
        yield from [i] * n

list(expandIndices(list1))
# [1, 1, 2, 3, 3, 3]

1
enumerate函数接受第二个参数,即起始计数值,无需使用i+1。 - juanpa.arrivillaga
@juanpa.arrivillaga 哇!我不知道那个。谢谢。 - Mark
1
由于您的函数是生成器,它会产生其结果而不是自己制作列表 - 因此我建议不要将其称为“makeList”。 - kaya3
@kaya3 这是一个很好的观点。已编辑。 - Mark

1

使用标准for循环的解决方案,利用enumerate:

n = [2, 1, 3]
result = []
for i, x in enumerate(n, start=1):
    result.extend([i] * x)

或者,作为一条命令:
result = [i for i, j in enumerate(n, start=1) for k in range(j)]

1

我的原始(低效)答案:

l = [2, 1, 3]

print([j for i, v in enumerate(l, 1) for j in [i] * v])

输出:

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

基于 @kaya3 的评论,回答更有效率了!(谢谢!):

print( [i for i, v in enumerate(l, 1) for _ in range(v)] )

2
[ i for i, v in enumerate(l, 1) for _ in range(v) ] 可以避免创建大量的临时列表。 - kaya3
@kaya3 是的,没错,我会编辑答案。 - Andrej Kesely

0

要重复一个字符串多次,可以使用乘法运算符,例如:

print("1" * 5)
# 11111

这个技巧可以用来解决你的问题:

values = "132"
list1 = [2, 1, 3]
result = []
for value, count in zip(values, list1):
    result.extend(value*count)
print(result)
# -> ['1', '1', '3', '2', '2', '2']

你也可以使用一个 int 列表:

values = [[1], [2], [3]]
list1 = [2, 1, 3]
result = []
for value, count in zip(values, list1):
    result.extend(value*count)
print(result)
# -> [1, 1, 2, 3, 3, 3]

2
为什么不直接写result.extend([value] * count),而是要求输入以不同的格式呈现? - kaya3
当然可以。 - Laurent LAPORTE

-1
lengths = [2, 1, 3]

result = sum([[number] * length for number, length in enumerate(lengths, start=1)], [])
print(result)

输出:

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

2
请注意,使用sum来连接一组列表需要O(n^2)的时间。 - kaya3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接