【问题标题】:Why 'ValueError: list.remove(x): x not in list' is occurring if x is there?如果 x 存在,为什么会出现“ValueError: list.remove(x): x not in list”?
【发布时间】:2020-07-11 12:38:22
【问题描述】:

这是一个代码,它打开一个表格 .csv 并读取每行的行以将数据保存在两个变量中,保存在一个列表中。此外,我想过滤工作表(.csv)的一些数据,因为我不需要它,我正在过滤应用下面的内容,有 x.remove(i) 和 y.remove(i) 但它们正如我在标题中报告的那样,两者都是错误的。我该怎么办?我在做什么错?

g=float(9.8)

x=[]
y=[]

dados = open('dados123.csv').readlines() #trocar para o nome_do_arquivo após testes de diagnóstico



def adiciona_dados():
    for i in range (len(dados)):
        if i !=0:  
            linha = dados[i].split(";")
            x.append(float(linha[0]))
            y.append(float(linha[1])*g)
        else:
            print('erro1')

len(x)
len(y)
adiciona_dados()



for i in y:  
    if y[i] < 30:

        x.remove(i)
        y.remove(i)              
    else:
        print('nada')

len(x)
len(y)

【问题讨论】:

  • 工作表中的数据是由代码具有的第一个和唯一的函数添加的:adiciona_dados(),这是有效的,因为当我编码 len(x) 或 len(y) 时有数据保存在列表中。
  • 您的两个列表中有不同的数字。试图从两个列表中删除相同的数字只是巧合。 (请注意,在迭代列表时从列表中删除项目将导致项目被跳过 - 而是迭代列表的副本)。
  • 在 append() 时更好地过滤它 - 这样你就不必删除它。
  • 顺便说一句:你可以用for line in dados[1:] 代替for i in range(len(dados))if i !=0:dados[i]

标签: python list for-loop spyder valueerror


【解决方案1】:

欢迎来到 Stack Overflow。我们没有您的 dadoos123.csv 文件的示例。但我们可以尝试了解您想要做什么。这是我对您的问题的解决方案:

import csv

g = 9.80

with open('dados123.csv', newline='') as dados_file:
    dados_reader = csv.reader(dados_file, delimiter=';')
    print('erro1')
    all_linha = list(dados_reader)
    x = [float(current_linha[0]) for current_linha in all_linha[1:] if float(current_linha[0]) >= 30]
    y = [float(current_linha[1]) * g for current_linha in all_linha[1:] if float(current_linha[0]) >= 30]

how_many_nada = (len(all_linha) - 1) - len(x)     # Could also been (len(all_linha) - 1) - len(y). No difference
for current_nada in range(how_many_nada):
    print('nada')

这就是你想要做的吗?

【讨论】:

  • 亲爱的 EvensF,感谢您的回答!问题仍然存在,因为当我尝试使用您的代码时,ValueError 是:解包的值太多(预期为 2)。在 .csv 文件中,我在每列中有超过 2.6k 的值,然后,每个列表都会保存这些值以进行过滤。
  • 您应该更好地解释您的问题,因为我无法猜测数据是什么样的。其他人愿意帮助您的可能性较小。当您提出问题时,请尝试提供minimal reproducible example。我改了答案这样会更好吗?
  • 我是社区的菜鸟,不是母语人士,如有任何麻烦,我们深表歉意。我要试试你的代码。
【解决方案2】:

原始码:

for i in y:  
    if y[i] < 30:

        x.remove(i)
        y.remove(i)              
    else:
        print('nada')

修改代码版本1:

for i in y:  
    if i < 30:

        x.remove(i)
        y.remove(i)              
    else:
        print('nada')

否则,Python 列表方法 remove() 在列表中搜索给定元素并删除第一个匹配的元素。但是如果两个相邻的元素重复,就会删除第一个,保留第二个。

重复num的修改代码version2:

for i in y:
    if i < 30:
        while x.count(i)>0:
            x.remove(i)
        while y.count(i)>0:
            y.remove(i)
    else:
        print("nada")

【讨论】:

  • " 但是如果相邻的两个元素重复,由于python自动内存管理,会删除第一个,保留第二个"什么?该行为与自动内存管理无关。这是由于在给定 Python 列表迭代器的行为的情况下尝试从列表中删除的逻辑错误,或者在您展示的情况下,由于删除将发生相同的错误按索引,但不考虑在更改列表大小时如何更改基础列表和索引...
  • 亲爱的daichaoyang,感谢您的回答和对我代码的编辑。但问题仍然存在,还有另一件奇怪的事情。我运行了你的代码,这不能一次过滤,我必须重新运行几次你编码的特定部分,以使结果收敛到我的数据目标,即过滤列表中小于 30.0 的单元格的数据。此外,每当我运行 if y[i]
  • 为了更好地向您展示,这里是您的代码的特定部分,我重新运行了几次以及 python 显示给我的数据:
  • len(y) Out[2]: 1280 for i in range(len(y)): if y[i] ”,第 2 行,在 如果 y[i]
  • 烯(y)的输出[24]:23岁出[25]:[33.66594,60.069100000000006,120.44102000000001,266.30030000000005,456.42128,611.49746,707.30226,759.0864400000002,785.67384,779.49494,747.0981,701.4438200000001,647.2076800000001 , 594.56992, 540.03488, 466.04782000000006, 371.61894, 272.4743, 189.01652000000004, 124.05526, 76.57132, 45.93848, 300.7345760]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 2022-06-28
  • 2023-02-23
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多