2012-07-03 2 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' 

Я хочу, чтобы заменить все «F» с «R» и наоборот. Это выполняет это, но исходный список «порядок» также изменяется. Я только хочу, чтобы второй список был изменен и не мог понять, в чем проблема с моим кодом.

Что я получаю:

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

Кажется, что, как и во многих других языках, массивы не более, чем константы (даже не реальных указателей, хотя это может быть различным в Python). Скорее, адрес первого элемента массива постоянный. Это означает, что если вы непосредственно скопировали массив, вы бы скопировали только адрес первого элемента.

С вашего вопроса, я понимаю, что вам нужна глубокая копия. Это означает, что вам также нужно скопировать содержимое ваших вложенных массивов. Вы можете использовать copy.deepcopy(x), чтобы сделать глубокую копию массива.

Проверьте информацию об copy module и получите более подробную информацию.

 Смежные вопросы

  • Нет связанных вопросов^_^