Python 3.x 我想检查特定项在所有其他项中的出现情况(即使是子字符串)
我想检查特定项在所有其他项中的出现情况(即使是子字符串) 这是我的代码 结果是Python 3.x 我想检查特定项在所有其他项中的出现情况(即使是子字符串),python-3.x,Python 3.x,我想检查特定项在所有其他项中的出现情况(即使是子字符串) 这是我的代码 结果是 [[66',3],'66',3],'66',3],'66',3]。 但是期望的输出是 [[28',1],'4663',1],'66',3],'66',3] 请帮助我找出代码的错误。您在occ\u arr列表中的所有子列表都引用了相同的列表,因为您使用*操作符复制了相同列表的引用,因此一个子列表中的任何更改都会反映在所有其他子列表上。您应该改为使用列表理解来创建不同的子列表 更改: occ_arr = [[0,0]]*
[[66',3],'66',3],'66',3],'66',3]。
但是期望的输出是
[[28',1],'4663',1],'66',3],'66',3]
请帮助我找出代码的错误。您在
occ\u arr
列表中的所有子列表都引用了相同的列表,因为您使用*
操作符复制了相同列表的引用,因此一个子列表中的任何更改都会反映在所有其他子列表上。您应该改为使用列表理解来创建不同的子列表
更改:
occ_arr = [[0,0]]*len(n_a)
致:
更改:
occ_arr = [[0,0]]*len(n_a)
致:
将修复程序中出现的错误。如果要使此语句成为一行语句,请使用以下列表:
occ_arr = [[0,0] for _ in n_a]
#Add the list [0,0] for each item in the list n_a
总之,程序变成(使用单线解决方案):
错误解释 错误发生的原因是列表的存储方式。它们不是存储为文字数据(如
int
s、float
s等),而是存储为对象,带有内存地址和ID。该行:
cc_arr = [[0,0]]*len(n_a)
用它自己的唯一id创建一个列表,然后复制它四次(简单地[只复制内存地址,而不是数据])。这可以通过以下示例显示:
>>> x = [[0,0]] * 4
>>> for item in x:
... print(id(x))
4500701640
4500701640
4500701640
4500701640
请注意,您的输出将不同
因此,当您更改一个列表时,您会更改对象的底层表示,这会更改其他浅层副本,这就是为什么您的程序会输出[[66',3],'66',3],'66',3]
而不是[[28',1],'4663',1],'66',3],'66',3]
occ_arr = [[0,0] for _ in n_a]
#Add the list [0,0] for each item in the list n_a
n_a = ['28', '4663', '66', '66']
occ_arr = [[0,0] for _ in n_a]
for i in range(len(n_a)):
count=0
for j in range(len(n_a)):
if n_a[i] in n_a[j]:
count+=1
occ_arr[i][0] = n_a[i]
occ_arr[i][1] = count
print(occ_arr)
print(occ_arr)
cc_arr = [[0,0]]*len(n_a)
>>> x = [[0,0]] * 4
>>> for item in x:
... print(id(x))
4500701640
4500701640
4500701640
4500701640