【问题标题】:create new list at every replacement by interative index in python通过python中的交互索引在每次替换时创建新列表
【发布时间】:2017-08-13 17:04:33
【问题描述】:

我有一个字符串str = "abcd"

我想用“X”替换str的第一个字符,追加到空列表, 用“X”替换第二个字符,附加到列表中, 重复直到所有元素都被替换,产生以下列表列表:

[['N', 'b', 'c', 'd'],
 ['a', 'N', 'c', 'd'],
 ['a', 'b', 'N', 'd'],
 ['a', 'b', 'c', 'N']]

我试过了:

str = "abcd"
bla = list(str)
blabla = [bla]*len(bla)
for i,e in enumerate(blabla):
    e[i]="N"

我没有“追加”,因为我不知道如何在这种情况下。不想要的结果是:

[['N', 'N', 'N', 'N'],
 ['N', 'N', 'N', 'N'],
 ['N', 'N', 'N', 'N'],
 ['N', 'N', 'N', 'N']]

python 3.5 中最好的解决方案是什么?

【问题讨论】:

  • 非常混乱...如果不打印预期的结果将很难帮助
  • 请输入您的实际输出。
  • 开头打印预期结果,最后打印实际输出。
  • 谢谢@juanpa.arrivillaga

标签: python list loops indexing replace


【解决方案1】:
mystr = "abcd"
bla = list(mystr)
old_d =  [bla]* 4

# As others pointed, old_d is list of list of same objects. You can see the memory address of each element

print("memory address for old_d's elements are {}, {}, {}, {}".format(id(old_d[0]), id(old_d[1]),id(old_d[2]),id(old_d[3])))

#call list function as many times as lenfth of the string using list comprehension. 

new_d =  [list(mystr) for i in list(mystr)]    
print("memory address for new_d's elements are {}, {}, {}, {}".format(id(new_d[0]), id(new_d[1]),id(new_d[2]),id(new_d[3])))

for i,_ in enumerate(bla):
    new_d[i][i] = "N"

print new_d

结果:

memory address for old_d's elements is 66070248, 66070248, 66070248, 66070248
memory address for new_d's elements are 135819952, 135819912, 135819872, 135819752
[['N', 'b', 'c', 'd'], ['a', 'N', 'c', 'd'], ['a', 'b', 'N', 'd'], ['a', 'b', 'c', 'N']]

【讨论】:

    【解决方案2】:
    string = "abcd"
    
    ret = []
    for l in range(len(string)):
        t = list(string)
        t[l] = 'X'
        ret.append(t)
    
    print(ret)  # [['X', 'b', 'c', 'd'], ['a', 'X', 'c', 'd'], ['a', 'b', 'X', 'd'], ['a', 'b', 'c', 'X']]
    

    【讨论】:

      【解决方案3】:
      s = 'abcd'
      
      res = []
      for i in range(len(s)):
          l = list(s) 
          l[i] = 'N'
          res.append(l)
      
      print res
      

      【讨论】:

        【解决方案4】:

        正如其他人指出的那样,您的问题在这里:blabla = [bla]*len(bla)

        blabla 指向列表bla 4 次。更改blabla 中的任一元素都会更改所有元素。

        如果您想继续使用您的方法,请将列表定义为blabla = [list(bla) for _ in bla]。否则其他答案有效。

        【讨论】:

          【解决方案5】:

          以下行将创建对同一对象的多个引用而不是独立列表,这就是为什么更改其中一个会影响其他的原因。

          blabla = [bla]*len(bla)
          

          也不要使用 python 内置类型名称和关键字作为参数名称。

          您无需在添加项目之前创建一个空列表。相反,您可以在嵌套列表理解中使用 enumerate

          In [42]: [['N' if ind==i else char for ind, char in enumerate(st)] for i in range(len(st))]
          Out[42]: 
          [['N', 'b', 'c', 'd'],
           ['a', 'N', 'c', 'd'],
           ['a', 'b', 'N', 'd'],
           ['a', 'b', 'c', 'N']]
          

          【讨论】:

          • 使用关键字作为参数名称?这真的可能吗?
          • @StefanPochmann 是的,不可能完全按照它们的方式使用它们,但在不同的情况下,比如 FALSE。它不像使用复制它们的内置类型名称那样具有影响,但会造成混淆并且在编码风格方面不是pythonic。
          猜你喜欢
          • 1970-01-01
          • 2017-03-31
          • 1970-01-01
          • 2023-03-10
          • 2012-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多