1

我正在尝试制作一个重复的列表列表并将一个元素更改为重复列表的嵌套列表中的另一个元素,但遇到了一些麻烦。我如何制作重复列表:

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']]

谢谢大家!

4

5 回答 5

4

您在这里所做的是列表的浅表副本,因此当您更改副本时,原始副本也会更改。你需要的是深拷贝

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']
于 2012-07-03T16:31:59.947 回答
3
L = [['F' if x == 'R' else 'R' if x == 'F' else x for x in row] for row in order]
于 2012-07-03T16:40:29.627 回答
1
import copy
order_1 = copy.deepcopy(order)

默认情况下,Python 只复制对可变值的引用,因此在一处更改它们会导致它们在任何地方都被更改。创建深拷贝意味着这两个实例是完全独立的。

于 2012-07-03T16:32:35.907 回答
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)
于 2012-07-03T16:33:42.243 回答
-1

似乎与许多其他语言一样,数组只不过是常量(甚至不是实际的指针,尽管在 python 中可能有所不同)。相反,数组的第一个元素的地址是恒定的。这意味着如果你直接复制数组,你只会复制第一个元素的地址。

根据您的问题,我了解到您想要一个深层副本。这意味着,您还需要复制嵌套数组的内容。您可以copy.deepcopy(x)用来制作数组的深拷贝。

查看复制模块以获取更深入的信息。

于 2012-07-03T16:47:50.647 回答