2016-05-16 50 views
5

我想替换那些list1的元素,其索引存储在列表indiceslist2元素。以下是当前的代码:Python单行要替换一个列表索引

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

是否有可能写一行程序使用lambda函数列表理解上述四行?

编辑
list1包含浮点值
list2包含浮点值
indices包含0len(list1)

+0

没有,列表内涵不能修改现有列表。 –

+2

你能举一个'list1','list2'和'incides'包含的例子吗? –

+0

@MorganThrapp创建新列表的选项是* open *! – vvy

回答

4

使用conditional expressions

# 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] 
+0

嗨,这个看起来不正确。为什么选择'list2'的'idx'条目? 'list1 [idx]'条目将被替换为'list2'条目(以串行方式)。 – vvy

+0

@vvy,thx,我用一个例子编辑了我的答案。结果与您的原始代码一致。 – SparkAndShine

2

的整数这不是那么漂亮,但你可以解决这个问题是这样的:

map(list1.__setitem__, indices, list2) 
+1

你会说它在Python 3中不起作用。 – vaultah

+0

虽然很聪明,但PEP 20可能会反对。 – boardrider

+0

我同意你们,但OP要求提供“单线”,我交付了它:) – zoubida13

3

虽然它不是一个衬垫,这里是我认为是更具可读性的替代:

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

当然,如果你将'list1 [i] = v'移动到'for'循环的同一行上,那么它就是1行,这绝对是最干净的答案! –