Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python中的交互索引在每次替换时创建新列表_Python_List_Loops_Indexing_Replace - Fatal编程技术网

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