2011-12-10 67 views
0

我試圖用另一個列表中的項目替換列表中的項目。將1列表中的項目替換爲另一個列表中的項目python

alist = [[1,2,3], [4,5,6], [7,8,9]] 
    blist = [[a,b,c], [d,e,f], [g,h,i]] 

基本上,我想用blist對應物替換alist中的項目。例如,如果某人在alist中選擇了1,我想用blist中的相同索引替換它,這將是一個。

alist = [[a,2,3], [4,5,6], [7,8,9]] 

有什麼建議嗎?

回答

1
>>> z = [(i, x.index(item)) for i, x in enumerate(alist) if item in x][0] 
>>> alist[z[0]][z[1]] = blist[z[0]][z[1]] 
>>> alist 
[['a', 2, 3], [4, 5, 6], [7, 8, 9]] 

看到它聯機工作:ideone

+0

我也喜歡。 – pyfunc

0

原油,但很容易解釋:

blist = [['a','b','c'], ['d','e','f'], ['g','h','i']] 
alist = [[1,2,3], [4,5,2], [7,8,9]] 
x = 2 

for y in xrange(len(alist)): 
    if x in alist[y]: 
     i = alist[y].index(x) 
     alist[y][i] = blist[y][i] 

print alist 

輸出:

[[1, 'b', 3], [4, 5, 'f'], [7, 8, 9]] 
2

一種方法是遍歷兩個列表一起,然後循環在每個子組上替換匹配的選項。

對於鎖步迭代,zip函數是你最好的朋友。對於轉換列表,list comprehension是一個很好的工具。以下是如何使用它們:

>>> alist = [[1,2,3], [4,5,6], [7,8,9]] 
>>> blist = [[10,20,30], [40,50,60], [70,80,90]] 
>>> choice = 1 
>>> alist = [[(bx if ax==choice else ax) for ax, bx in zip(aseq, bseq)] for aseq, bseq in zip(alist, blist)] 
>>> alist 
[[10, 2, 3], [4, 5, 6], [7, 8, 9]] 

什麼是對這種做法很好的地方在於它可以做多的替代品(例如,如果ALIST包含幾個1條目,它們都被替換爲在其相應的條目blist)。

另一個不錯的特性是ax==choice決定可以很容易地被其他謂詞所替代(例如,ax in {2, 5, 8}將在一次通過中搜索多個替換目標)。另一個例子是ax % 2 == 0這將使blist替代任何alist值甚至)。

+0

使用zip的+1 – pyfunc

相關問題