【问题标题】:Python Value Error when attempting to remove an element from a list尝试从列表中删除元素时出现 Python 值错误
【发布时间】:2019-05-12 21:13:59
【问题描述】:

该程序假定获取一个文本文件并将其内容转换为一个列表,其中每个元素都是原始文本文件中的一行。从那里我希望能够查看另一个列表中的某些网站是否包含在一个元素中,如果是,则从列表中删除该元素。我不断收到 ValueError

with open(hosts_temp, 'r+') as file1:
     content = file1.read() 
     x = content.splitlines() #convert contents of file1 in to a list of strings.

     for element in x:
         for site in websites_list:
             if site in element:
                 x.remove(element)      
             else:
                 pass

这是我得到的错误:

ValueError: list.remove(x): x not in list

【问题讨论】:

  • 错误信息与您的代码不匹配,它会在迭代时从列表中删除...
  • 我想你需要break找到并删除,但即使这样也行不通。改为使用列表推导重建列表
  • 它也可能是重复的情况。如果您的站点在元素中多次出现,并且在 x.xml 中仅出现一次。即使这样,也会提示这个错误。

标签: python list valueerror


【解决方案1】:

问题是您正在从线阵列中删除该线,然后尝试再次访问它。

例如,如果您有一个网站列表

website_list = ["google","facebook"]

你的 x(行列表)是

["First sentence","Second sentence containing google","Last sentence"]

看这个循环

for site in websites_list:

您将从 x 中删除第二个句子,因为您匹配了 google。但是,您还可以尝试检查第二个句子是否包含“facebook”。因为您已经从 x 列表中删除了第二句,所以您会收到错误消息。

我会建议逐行阅读文件,而不是一次抓取所有行。如果是没有网站名称的行,则将其添加到有效的列表集合中。

解决这个问题的另一种pythonic方法是使用列表推导 如果您的输入不大

with open(hosts_temp, 'r+') as file1:
 content = file1.read() 
 x = content.splitlines()
 x = [line for line in x if all(w not in line for w in websites_list)]

在遍历集合并在此过程中添加/删除元素时要非常小心。

【讨论】:

  • 在迭代它时,您仍在从列表中删除该元素。如果后面有 2 个要删除的元素,则您将跳过第二个
  • 你是完全正确的。使用 pythonic 替代方法修复
猜你喜欢
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 2022-11-02
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
相关资源
最近更新 更多