2017-08-02 70 views
4

我做了這樣的事情:迭代,直到第二個數組的結尾使用python

d = [('e', 0), ('f', 1), ('e', 0), ('f', 1)] 
e = ['a'] 
d = [(n,j) for n,(i,j) in zip(e,d)] 
d 
[('a',0)] 

我只是tryig以取代數組值等價的元組值,而無需更改相關的數字。但是這個列表直到列表e而不是d。我想作爲輸出是這樣的:

d 
[('a', 0), ('f', 1), ('e', 0), ('f', 1)] 

回答

4

只需添加的d未處理尾要處理的部分:

[(n,j) for n,(i,j) in zip(e,d)] + d[len(e):] 
#[('a', 0), ('f', 1), ('e', 0), ('f', 1)] 
+0

謝謝你,先生,這工作。 –

3

您可以使用itertools.zip_longest

[(n or i, j) for n,(i,j) in itertools.zip_longest(e, d)] 

檢查doc

+0

你的意思是'zip_longest'對嗎? –

+0

@ Jean-FrançoisFabre,是的,我沒有看到py3標籤,謝謝! – Netwave

+0

你可以放棄'fillvalue = None',因爲這是默認值。 –

0

我覺得親blem是zip函數。該文檔說(zip)「返回元組的迭代器,其中第i個元組包含來自每個參數序列或迭代器的第i個元素。當最短輸入迭代耗盡時,迭代器停止。」

[(n,j) for n,(i,j) in zip(e,d)] + d[len(e):]應該做的伎倆

+0

謝謝你的解釋。但讓我編輯您的文章格式正確。 –

1

如果它是可以接受的變異原d名單,我想簡單地通過迭代上e更換一次d元組:

d = [('e', 0), ('f', 1), ('e', 0), ('f', 1)] 
e = ['a'] 

for i, new_letter in enumerate(e): 
    d[i] = (new_letter, d[i][1]) 

print(d) 
# [('a', 0), ('f', 1), ('e', 0), ('f', 1)] 

需要注意的是Python的元組是不可變的。 d[i][0] = new_letter會失敗,出現錯誤:

TypeError: 'tuple' object does not support item assignment

上面的代碼用新的取代舊的元組修改到位d列表。它不能修改舊的元組。

+0

我也試過。它給了我錯誤說:''元組'對象不支持項目分配'因此,我真的拒絕了我的主意 –

+0

。它也工作。我仍然懷疑自己做錯了什麼,而我之前也遵循過類似的過程。 –

+0

是的。我知道了。問題在於我所做的價值賦值。你已經分配了像這樣的值'd [i] =(new_letter,d [i] [1])',在這裏我分配了像這樣的'd [i] [0] = new_letter' –

相關問題