python—在预定义的位置将值从一个列表插入到另一个列表中

python—在预定义的位置将值从一个列表插入到另一个列表中,python,list,for-loop,list-comprehension,Python,List,For Loop,List Comprehension,在Python(3.5)中,如果我有这样一个长列表: long_list = ['0','1','0','1','0','0'.'0'.'1','1','0'] short_list = [8,7,6,5] 和一个短列表,其长度等于长列表中“1”的数量,如下所示: long_list = ['0','1','0','1','0','0'.'0'.'1','1','0'] short_list = [8,7,6,5] 我如何创建一个新的列表,将短列表中的值“插入”到长列表中的每个索引中,其

在Python(3.5)中,如果我有这样一个长列表:

long_list = ['0','1','0','1','0','0'.'0'.'1','1','0']
short_list = [8,7,6,5]
和一个短列表,其长度等于长列表中“1”的数量,如下所示:

long_list = ['0','1','0','1','0','0'.'0'.'1','1','0']
short_list = [8,7,6,5]
我如何创建一个新的列表,将短列表中的值“插入”到长列表中的每个索引中,其中有一个“1”,并且为了一致性,“用一些数字替换”长列表中的“0”(比如99)

我可以用一个非常痛苦的for循环来实现这一点,但似乎应该有一种方法通过列表理解来更有效地实现这一点,不是吗

# bad solution
new_list = []
x = 0
for i in range(len(long_list)):
    if long_list[i] == '0':
        new_list.append(99)
    else:
        new_list.append(short_list[x])
        x += 1
期望输出:

new_list = [99,8,99,7,99,99,99,6,5,99]

short\u list
转换为迭代器,并使用list comprehension从中为每个
'1'
获取值,否则使用固定值:

>>> long_list = ['0','1','0','1','0','0','0','1','1','0']
>>> short_list = [8,7,6,5]
>>> it = iter(short_list)
>>> [next(it) if x == '1' else 99 for x in long_list]
[99, 8, 99, 7, 99, 99, 99, 6, 5, 99]

显然,只有当
short\u list
的元素数量与
long\u list
上的
1
相同或更多时,这种方法才有效。上面有O(n)时间复杂度,其中n
长列表中的元素数量。请注意,这对所有类型的iterables都是一样的,
long\u list
short\u list
可能是生成器,并且最终结果是相同的。

如果您在更改
short\u list
时没有问题,您可以使用:

输出:

>>> long_list = ['0', '1', '0', '1', '0', '0', '0', '1', '1', '0']
>>> short_list = [8, 7, 6, 5]
>>>
>>> [short_list.pop(0) if i == '1' else 99 for i in long_list]
[99, 8, 99, 7, 99, 99, 99, 6, 5, 99]

并不是说这是最好的方法,但它不需要新的变量

[99 if long_list[i] == '0' else short_list[long_list[:i].count('1')]
 for i in range(len(long_list))]

您确定
short\u list
中的值总是与
long\u list
中的
'1'
一样多吗?是的,此应用程序中有。短列表源于长列表。可能有太多的信息无法解释实际使用情况(上面的示例是一个基于真实数据的玩具示例),但我确信短列表的值与“1”的值完全相同。谢谢,这非常有效,而且非常快(在我的200000多个项目的真实“长列表”中,只花了不到一秒钟的时间)。我应该更经常地使用迭代器。