用python中的交互索引在每次替换时创建新列表
我有一个字符串用python中的交互索引在每次替换时创建新列表,python,list,loops,indexing,replace,Python,List,Loops,Indexing,Replace,我有一个字符串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,
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中的最佳解决方案是什么?下面的一行将创建对同一对象的多个引用,而不是独立列表,这就是为什么更改其中一个将影响其他对象的原因
blabla = [bla]*len(bla)
另外,不要使用python内置类型名和关键字作为参数名
在附加项目之前,不需要创建空列表。相反,您可以在嵌套列表中使用:
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']]
正如其他人所指出的,您的问题就在这里:
blabla=[bla]*len(bla)
blabla
指向列表bla
4次。对blabla
中任一元素的更改将更改所有元素
如果要继续使用方法,请将列表定义为blablabla=[list(bla)for uu.in bla]
。否则,其他答案是有效的
s = 'abcd'
res = []
for i in range(len(s)):
l = list(s)
l[i] = 'N'
res.append(l)
print res
结果:
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']]
非常混乱。。。如果不打印预期结果,则很难看到以下问题:请输入实际输出。预期结果在开头打印,实际输出在结尾打印。谢谢@juanpa.arrivillagaUsing关键字作为参数名称?这真的可能吗?@StefanPochmann是的,不可能完全按照它们的方式使用它们,但在不同的情况下,比如FALSE。它不像使用复制它们的内置类型名那样有影响,但会造成混乱,而且在编码风格方面不是pythonic。
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']]