获取 "unknown variable x" 或 "ValueError" 时将变量与 "int" 的 "type" 放在方法的参数中,即“.remove()”

Getting "unknown variable x" or "ValueError" when putting a variable with the "type" of "int" in a method's parameter i.e.".remove()"

为什么名称(变量)被解释器认为是“未知变量 'x'”,而不是它具有的“值”。`

list_of_names = [1, 1, 1, 1, 1, 2, 2, 2, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]
name = 0
for name in range(100):
    counter = list_of_names.count(name)
    while counter > 1:
            list_of_names.remove(name)

print(list_of_names)

` 显示的输出:

Traceback (most recent call last):
  File "x", line 6, in <module>
    list_of_names.remove(name)
ValueError: list.remove(x): x not in list

Process finished with exit code 1

OP 如果您要删除重复项,请使用:

list(set(list_of_names))

set(iterable) 忽略重复项。


这里是the documentation for list.remove

s.remove(x) remove the first item from s where s[i] is equal to x (3)

注意脚注 (3)

  1. remove raises ValueError when x is not found in s.

这是一个正在发生的事情的例子:

s = [1, 2, 3]
s.remove(1)
print(s) # [2, 3]
s.remove(1) # ValueError because s does not have a 1

我不确定你试图用你的代码完成什么,但这就是你得到 ValueError 的原因。

因为调用removelist_of_names里面没有name。我不明白你想用该代码实现什么。但是您可以通过添加一点检查来避免该异常。

list_of_names = [1, 1, 1, 1, 1, 2, 2, 2, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]
name = 0
for name in range(100):
    counter = list_of_names.count(name)
    while counter > 1 and name in list_of_names: #Add a check here to avoid the exception
            list_of_names.remove(name)

print(list_of_names)

当所有 name 从列表中删除时,while 循环不会终止并仍然尝试删除列表中不存在的 name

您需要在 while 循环中减少 counter 的值,以便在列表中没有 name 时终止。

list_of_names = [1, 1, 1, 1, 1, 2, 2, 2, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]
name = 0
for name in range(100):
    counter = list_of_names.count(name)
    while counter > 1:
        counter -= 1
        list_of_names.remove(name)

print(list_of_names)
[1, 2, 3]

我发现了一些问题:

首先,您遇到问题的主要原因是您的 counter 语句实际上并没有减少,因为它在 while 语句之外。

我用这段代码让它工作:

list_of_names = [1, 1, 1, 1, 1, 2, 2, 2, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]
name = 0
for name in list_of_names:
  while True:
    counter = list_of_names.count(name)
    if counter < 1:
      break
    print(f"Counter: {counter}")
    print(name in list_of_names)
    print(name)
    print(list_of_names)
    list_of_names.remove(name)
            

print(list_of_names)
while counter > 1:
        list_of_names.remove(name)

该循环将(尝试)永远 运行,因为您没有在循环内更改 counter

如果它从 5 开始,那么它将永远是 5,因为循环中的任何内容都不会改变它。最终您将从列表中删除最后一次出现的 name,然后下一个循环迭代将崩溃。