【问题标题】:replacing items in nested lists python替换嵌套列表python中的项目
【发布时间】:2012-07-03 16:29:11
【问题描述】:

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

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

谢谢大家!

【问题讨论】:

    标签: python nested-lists deep-copy


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:
      L = [['F' if x == 'R' else 'R' if x == 'F' else x for x in row] for row in order]
      

      【讨论】:

      • +1000;不要复制然后更改它,只需制作您想要制作的东西。
      • @KarlKnechtel,是的,但是对于初学者来说有点难以理解。
      • 唯一的问题是'gap'元素在输出中变成了['g','a','p']。我不知道如何解决这个问题...... @KarlKnechtel 我没有那样想这个问题。但是,是的,这可能会使事情变得更简单。 Dhara,我是一个初学者,对此感到/有点困惑。
      • @Elisabeth:要修复“差距”,您可以[[...] if isinstance(row, list) else row for row in order],尽管它超出了列表理解的限制。顺便说一句,nested list comprehension is described in the tutorial 每个初学者都应该阅读。
      【解决方案3】:
      import copy
      order_1 = copy.deepcopy(order)
      

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

      【讨论】:

      • 正是我需要的。谢谢。
      【解决方案4】:
      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)
      

      【讨论】:

        【解决方案5】:

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

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

        查看copy module 了解更多详细信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-28
          • 2012-11-11
          • 1970-01-01
          • 2016-04-03
          • 2018-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多