插入值列表代替列表中的值

Inserting a list of values in place of a value in a list

我有一个值列表:

a = [0.5, 2.3, 3.1, 1.4, 3.2, 2.2, 1.3, 1.5]

我想用值列表替换其中一个值。

b = [1.1, 1.6, 1.8]

例如,假设我想用列表 b 中的值替换值 1.3。 我试过这个方法,但没有得到想要的结果:

new_a = [b if x==1.3 else x for x in a]

这样我在列表中插入了一个列表

[0.5, 2.3, 3.1, 1.4, 3.2, 2.2, [1.1, 1.6, 1.8], 1.5]

我想实现的结果是:

[0.5, 2.3, 3.1, 1.4, 3.2, 2.2, 1.1, 1.6, 1.8, 1.5]

下面的方法给了你想要的。我通过在 a (idx) 中获取 1.3 的位置来完成此操作,然后将列表带到该位置,加上 b 加上该位置之后的列表:

idx = a.index(1.3)
new_a = a[:idx] + b + a[idx+1:]

输出:

[0.5, 2.3, 3.1, 1.4, 3.2, 2.2, 1.1, 1.6, 1.8, 1.5]

可以使用index方法获取值为1.3的元素的索引;然后将 b 分配给 a 的切片(参见 docs 关于目标为切片时的赋值语义)

ix = a.index(1.3)
a[ix : ix + 1] = b

print(a)

输出

[0.5, 2.3, 3.1, 1.4, 3.2, 2.2, 1.1, 1.6, 1.8, 1.5]

Timings(对于此输入;包括设置代码——即定义 ab)。

如果您需要创建一个新列表,下面的第二组结果来自重复执行上面相同的两个语句加上一个之前的语句,c = a.copy(),它创建一个 [=30= a 的浅拷贝。

# oda
255 ns ± 4.07 ns per loop (mean ± std. dev. of 7 runs, 100,000,000 loops each)
# oda (make a copy of a using a.copy() and assign to c, then modify a as above)
290 ns ± 5.93 ns per loop (mean ± std. dev. of 7 runs, 100,000,000 loops each)

# Emi
366 ns ± 8.24 ns per loop (mean ± std. dev. of 7 runs, 100,000,000 loops each)