我有一个字符串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中最好的解决方案是什么?
答案 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']]