2012-07-03 50 views
0

我想重複列表的列表並將重複列表的嵌套列表中的一個元素更改爲另一個,但我有一些麻煩。 我如何做重複的名單:替換嵌套列表中的項目python

order = [['yhjK', 'F'], 'gap', ['bcsA', 'F'], ['bcsB', 'F'], ['bcsZ', 'F'], 'gap', ['yhjK', 'R']] 
#order_1 = list(order) #this makes the duplicate list as well 
order_1 = [] 
for x in order: 
    order_1.append(x) 

我如何改變的元素:

for item in order_1: 
    for n,i in enumerate(item): 
      if i=='R': 
        item[n]='F' 
      if i=='F': 
        item[n]='R' 

我想用「R」,反之亦然,以取代所有的「F」。這完成了,但原來的列表'順序'也改變了。我只想要更改第二個列表,但無法弄清楚我的代碼有什麼問題。

我得到什麼:

order = [['yhjK', 'R'], 'gap', ['bcsA', 'R'], ['bcsB', 'R'], ['bcsZ', 'R'], 'gap', ['yhjK', 'F']] 
order_1 = [['yhjK', 'R'], 'gap', ['bcsA', 'R'], ['bcsB', 'R'], ['bcsZ', 'R'], 'gap', ['yhjK', 'F']] 

我想要什麼:

order = [['yhjK', 'F'], 'gap', ['bcsA', 'F'], ['bcsB', 'F'], ['bcsZ', 'F'], 'gap', ['yhjK', 'R']] 
order_1 = [['yhjK', 'R'], 'gap', ['bcsA', 'R'], ['bcsB', 'R'], ['bcsZ', 'R'], 'gap', ['yhjK', 'F']] 

謝謝大家!

回答

2

你在這裏做的是列表的淺表副本,所以當你改變副本時,原來的改變也是如此。你需要的是deepcopy

import copy 
order = [['yhjK', 'F'], 'gap', ['bcsA', 'F'], ['bcsB', 'F'], ['bcsZ', 'F'], 
'gap', ['yhjK', 'R']] 
order_1 = copy.deepcopy(order) 

# Now changing order_1 will not change order 
order_1[1] = ['TEST LIST'] 
print order[1] # Prints 'gap' 
print order_1[1] # Prints '['TEST LIST'] 
+0

謝謝!太棒了。 – Binnie

1
import copy 
order_1 = copy.deepcopy(order) 

的Python在默認情況下只可變值複製引用,所以改變它們在其中一個地方,結果到處都在發生變化。創建一個deep copy意味着這兩個實例是完全獨立的。

+0

正是我需要的。謝謝。 – Binnie

0
order_1 = [] 
for item in order: 
    temp = [] 
    for i in item: 
     if i=="F": 
      temp.append("R") 
     elif i=="R" 
      temp.append("F") 
     else: 
      temp.append(i) 
    order_1.append(temp) 
3
L = [['F' if x == 'R' else 'R' if x == 'F' else x for x in row] for row in order] 
+0

+1000;不要複製,然後改變它,只是做你想做的事情。 –

+0

@KarlKnechtel,是的,但初學者有點難以理解。 – Dhara

+0

唯一的問題是輸出中'gap'元素變成['g','a','p']。我不知道如何解決這個問題... @KarlKnechtel我沒有想到這個問題。但是,這可能會讓事情變得更簡單。 Dhara,我非常喜歡初學者,對此有點困惑。 – Binnie

-1

看來,與許多其他語言,數組並不比常量更多(甚至沒有實際的指針,儘管這可能是蟒蛇不同)。相反,數組的第一個元素的地址是常量。這意味着如果您直接複製數組,則只會複製第一個元素的地址。

從你的問題,我明白你想要一個深層複製。這意味着,您還需要複製嵌套數組的內容。您可以使用copy.deepcopy(x)來對陣列進行深度複製。

查看copy module瞭解更多詳細信息。