2016-05-16 43 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行,這絕對是最乾淨的答案! –