【问题标题】:Length of list within list (jagged list) becomes zero after leaving loop离开循环后,列表(锯齿状列表)中的列表长度变为零
【发布时间】:2018-09-20 20:14:41
【问题描述】:

全部 -

对于使用 Python 3.x 的 Selenium webscraper - 我试图获得一个取决于锯齿状列表中每个 1d 索引长度的打印输出,在这种情况下只有 2d。该列表名为masterViewsList,它包含的列表是名为viewsList 的列表的版本。下面看看我的masterViewsList列表viewsList是如何构造的:

from selenium import webdriver
import os

masterLinkArray = []
masterViewsList = []

# a bunch of code here that I cut out for simplicity's sake

for y in range(0, len(masterLinkArray)):
    browser = webdriver.Chrome(chromePath)
    viewsList = []
    browser.get(masterLinkArray[y])
    productViews = browser.find_elements_by_xpath("// *[ @ id = 'lightSlider'] / li / img")
    counter = - 1
    for a in productViews:
        counter = counter + 1
        viewsList.append(a.get_attribute('src'))
        print(viewsList[counter])
        print(len(viewsList))
    masterViewsList.append(viewsList)
    if y == 10:
        print(masterViewsList[y])
        print(len(masterViewsList[y]))
    del viewsList[:]

print(len(masterLinkArray))
print(len(masterViewsList))
print(len(masterViewsList[0]))
print(len(masterViewsList[1]))
print(len(masterViewsList[10]))

打印输出是这样的:

["https://us.testcompany.com/images/is/image/lv/1/PP_VP_L/544_PM2_Front%20view.jpg?wid=140&hei=140","https://us.testcompany.com/images/is/image/lv/1/PP_VP_L/544_PM1_Side%20view.jpg?wid=140&hei=140","https://us.testcompany.com/images/is/image/lv/1/PP_VP_L/544_PM1_Interior%20view.jpg?wid=140&hei=140","https://us.testcompany.com/images/is/image/lv/1/PP_VP_L/544_PM1_Other%20view.jpg?wid=140&hei=140","https://us.testcompany.com/images/is/image/lv/1/PP_VP_L/544_PM1_Other%20view2.jpg?wid=140&hei=140"]
5
79
79
0
0
0

如您所见,masterLinkArraymasterViewsList 都不是空的 - 它们的长度为 79。此外,print(masterViewsList[y]) 会打印出一个实际的非空列表,其长度为 5。奇怪的是,一旦我离开 for y 循环,len(masterViewsList[*any integer*]) 就会打印出“0”。这些类似的问题: Find the dimensions of a multidimensional Python array, Find length of 2D array Python, 两者都表明len(array[*integer*]) 是在列表中获取列表长度的正确方法,但在我的情况下,这似乎无法始终如一地工作。

【问题讨论】:

  • 我认为这些地址将有助于解决您的问题。有了这些信息,会有更多人有兴趣解决您的问题。
  • @Frank,感谢您的提示-对我来说很有意义。现在在上面的示例中使用了一些相关链接。
  • 你认为这只是一个python问题还是Selenium也在这个问题中起作用?添加其余代码可以帮助我找出问题所在。
  • @Frank,确定!代码现在在那里,在底部。我很感激这个提议!这一切都在进行中(也是我在 Python 中的第一个此类程序),所以请原谅所有的“额外”!很高兴澄清/回答任何问题 - 欢迎提出任何建设性的建议!

标签: python-3.x list jagged-arrays


【解决方案1】:

masterViewlist 是空的,您在其上调用 len 方法。这就是为什么 len 方法的所有结果都将为零的原因。

在您的代码的第一个简短版本中,这并不清楚,因为该版本中缺少以下代码行:

del viewsList[:]

在将viewList追加到masterViewList之后,这行代码导致masterViewlist再次为空。这是因为 del 命令删除了对该 viewList 的所有引用,包括 masterViewlist 中的引用。您可以删除 viewList 的这个 del,因为每次回到外部 for 循环的开头时,您都会从一个新的 viewList 开始。

【讨论】:

  • 删除del viewsList[:] 行有效。谢谢! del 的文档说:“...删除名称会从本地或全局名称空间中删除该名称的绑定,具体取决于名称是否出现在同一代码块中的全局语句中。如果名称未绑定,将引发 NameError 异常......”所以你说这意味着“变量的所有实例(甚至过去)都被删除,而不仅仅是当前/最近的实例,”是吗?我在代码的其他地方测试了这种解释,似乎是这样,但我想确保我做对了。
  • 另外,我应该更改这篇文章的标题以详细说明del 声明的问题吗?如果最终答案/主题最终与预期的原始问题/帖子不同,这样做是否符合政策?
猜你喜欢
  • 2016-06-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2022-06-28
  • 2019-11-17
  • 2013-09-17
  • 1970-01-01
  • 2012-08-31
相关资源
最近更新 更多