Python一行代码替换列表索引

5

我想将存储在列表indices中的索引对应的list1元素替换为list2元素。以下是当前的代码:

j=0
for idx in indices:
   list1[idx] = list2[j]
   j+=1

是否有可能使用lambda函数列表推导式将上述四行代码写成一行?

编辑
list1包含浮点数
list2包含浮点数
indices包含介于0len(list1)之间的整数


不,列表推导式不能修改现有的列表。 - Morgan Thrapp
2
你可以给出一个例子,说明list1list2indices会包含什么吗? - Aaron Christiansen
@MorganThrapp 创建新列表的选项是开放的 - vyi
@MorganThrapp 这是一个不好的编程实践,但他们可以这样做:x = [0, 0, 0]; [x.__setitem__(i, 5) for i in range(3)]; print(x) 将会输出 [5, 5, 5] - Aaron Christiansen
2
@OrangeFlash81 我的意思是,是的,你可以这样做。但如果你在生产代码中这样做,我会伤害你的。 - Morgan Thrapp
对于枚举中的 j 和 idx,将 list2[j] 赋值给 list1[idx]。 - f p
3个回答

5
使用条件表达式
# A test case
list1 = [0, 1, 2, 3, 4, 5, 6]
list2 = ['c', 'e', 'a']
indices = [2, 4, 0]

# Use conditional expressions
new_list = [list2[indices.index(idx)] if idx in indices else v for idx, v in enumerate(list1)] # idx2 = indices.index(idx), for list2

print(new_list)
# Output
['a', 1, 'c', 3, 'e', 5, 6]

嗨,这个似乎不对。为什么要选择list2idx条目?应该用list2的条目(按顺序)替换list1[idx]的条目。 - vyi
@vvy,谢谢,我用一个例子修改了我的答案。结果与您的原始代码一致。 - SparkAndShine

3

虽然不是一行代码,但我认为下面这个替代方案更易读:

for i, v in zip(indices, list2):
    list1[i] = v

当然,如果你将list1[i] = v移动到与for循环相同的行上,那么它就只有一行了,这绝对是最简洁的答案! - Tadhg McDonald-Jensen

2

虽然不太美观,但您可以按照以下方式解决:

map(list1.__setitem__, indices, list2)

虽然聪明,PEP 20 可能会有异议。 - boardrider
我同意你们的观点,但是楼主要求“一行代码”,我给出了它 :) - zoubida13

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