替换嵌套列表中的项目python

时间:2012-07-03 16:29:11

标签: python nested-lists deep-copy

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

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'也被更改了。我只想更改第二个列表,无法弄清楚我的代码有什么问题。

我得到了什么:

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

谢谢大家!

5 个答案:

答案 0 :(得分:4)

您在这里所做的是列表的浅表副本,因此当您更改副本时,原始内容也会发生变化。你需要的是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']

答案 1 :(得分:3)

L = [['F' if x == 'R' else 'R' if x == 'F' else x for x in row] for row in order]

答案 2 :(得分:1)

import copy
order_1 = copy.deepcopy(order)

Python默认只复制对可变值的引用,因此在一个地方更改它们会导致它们在任何地方都被更改。创建deep copy表示两个实例完全独立。

答案 3 :(得分: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)

答案 4 :(得分:-1)

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

根据您的问题,我了解您需要深层复印。这意味着,您还需要复制嵌套数组的内容。您可以使用copy.deepcopy(x)对数组进行深度复制。

查看copy module以获取更深入的信息。