通过python中的interative index在每次替换时创建新列表

时间:2017-03-21 20:06:11

标签: python list loops indexing replace

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

我想用“X”替换str的第一个char,附加到空列表, 用“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中最好的解决方案是什么?

5 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

blabla指向列出bla 4次。对blabla中任一元素的更改都将更改所有元素。

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

答案 2 :(得分:0)

s = 'abcd'

res = []
for i in range(len(s)):
    l = list(s) 
    l[i] = 'N'
    res.append(l)

print res

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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