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