如何基于python中的数字列表生成一定数量的数字?

如何基于python中的数字列表生成一定数量的数字?,python,Python,如何基于列表1创建以下数字的列表 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,1,2,3,3,3] (2) (1)(3)#这里有一种方法: list1=[2,1,3] list2 = [] for j, num in enum

如何基于列表1创建以下数字的列表

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,1,2,3,3,3]

(2) (1)(3)#这里有一种方法:

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, 1, 2, 3, 3, 3]

使用标准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, 1, 2, 3, 3, 3]
[1, 1, 2, 3, 3, 3]
我最初(低效)的回答是:

印刷品:

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

回答基于@kaya3评论-更高效!(谢谢!):


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

打印(“1”*5)
# 11111
此技巧可用于解决您的问题:

values=“132”
列表1=[2,1,3]
结果=[]
对于值,在zip中计数(值,列表1):
结果.扩展(值*计数)
打印(结果)
# -> ['1', '1', '3', '2', '2', '2']
您还可以使用
int
列表:

值=[[1]、[2]、[3]]
列表1=[2,1,3]
结果=[]
对于值,在zip中计数(值,列表1):
结果.扩展(值*计数)
打印(结果)
# -> [1, 1, 2, 3, 3, 3]

我认为这是一个生成器,可以根据需要生成平坦的值。比如:

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]

已经有很多很好的答案了,但是像这样的问题都应该用英语来回答,所以我的解决方案是这样的

>a=[2,1,3]
>>>从itertools导入链,重复
>>>列表(chain.from_iterable(对枚举(a,1)中的i,v重复(i,v)))
[1, 1, 2, 3, 3, 3]


您尝试过什么吗?我尝试过一些想法,比如使用for循环生成数字量,但不确定如何进一步实现。欢迎使用。这也是一个面向专业和热心程序员的问答网站。我们的目标是为您的问题提供一些自己的代码,以显示您自己为解决此问题所做的研究工作。@DeepSpace这有什么低效之处?就效率而言,这个解决方案是不错的。线性时间和空间,这是你能做的最好的。一个改进,不要使用
j=0
j+=
,只使用
为j,枚举中的num(列表1,1):为范围内的num(num):列表2。追加(j)
@juanpa.arrivillaga你是right@Sheri非常感谢你的回答。我理解这段代码,它对我来说非常有用。enumerate接受第二个参数,它是开始计数的初始值,不需要我+1@juanpa.arrivillaga哇!我不知道。谢谢。因为你的函数是一个生成器,它会产生结果,而不会自己生成一个列表——所以我建议不要把它叫做
makeList
@kaya3,这是一个很好的观点。编辑为什么不直接写
结果。扩展([value]*count)
而不是要求输入采用不同的格式?当然可以。
[i为i,v在枚举(l,1)中为u为范围(v)]
可以避免创建大量临时列表。@kaya3这是真的,我将编辑答案,注意使用
sum
连接列表集合需要O(n^2)个时间。可以更进一步:
list(chain.from_iterable(starmap(repeat,enumerate(a,1)))
print( [i for i, v in enumerate(l, 1) for _ in range(v)] )
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]