在列表中创建副本

12 浏览
0 Comments

在列表中创建副本

我有

 list = [a, b, c, d]

numbers = [2, 4, 3, 1]

我想获得以下类型的列表:

new_list = [a, a, b, b, b, b, c, c, c, d]

这是我目前所拥有的:

new_list=[] 
for i in numbers: 
    for x in list: 
        for i in range(1,i+1): 
            new_list.append(x)

admin 更改状态以发布 2023年5月21日
0
0 Comments

嵌套列表推导式可以工作:

L = ['a','b','c','d']
numbers = [2, 4, 3, 1]
>>> [x for x, number in zip(L, numbers) for _ in range(number)]
['a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'd']

“子循环” for _ in range(number) 重复值number次。
这里L可以持有任何对象,不仅仅是字符串。

例子:

L = [[1, 2, 3],'b','c', 'd']
numbers = [2, 4, 3, 1]
[x for x, number in zip(L, numbers) for _ in range(number)]
[[1, 2, 3], [1, 2, 3], 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'd']

但是这样会使子列表扁平化:

[x for i, j in zip(L, numbers) for x in i*j]
[1, 2, 3, 1, 2, 3, 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'd']

不是完全期望的结果。

0
0 Comments

下面是使用zip、字符串乘法和列表推导的一种方法:

lst = ['a', 'b', 'c', 'd'] 
numbers = [2 , 4, 3, 1]
r = [x for i, j in zip(lst, numbers) for x in i*j]
print(r)
# ['a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'd']

在使用Python时,请注意名称的选择。例如,使用list这样的名称将使内置的列表函数无法使用。

如果lst中的项不是字符串,您可以简单地在range上使用嵌套推导来复制列表中的项。

0