创建锯齿状数组时列出超出范围的索引
List index out of range while creating jagged array
所有,我正在尝试在 Python 3.x 中创建一个锯齿状列表。具体来说,我正在使用 Selenium 从网页列表中提取一些元素。我的锯齿状列表 ("matrix") 的每一行代表这些网页之一的内容。这些行中的每一行都应该有与其各自网页中提取的元素一样多的列 - 这个数字会因页面而异。
例如
webpage1 has 3 elements: a,b,c
webpage2 has 6 elements: d,e,f,g,h,i
webpage3 has 4 elements: j,k,l,m
...
看起来像:
[[a,b,c],
[d,e,f,g,h,i],
[j,k,l,m],...]
到目前为止,这是我的代码:
from selenium import webdriver
chromePath = "/Users/me/Documents/2018/chromedriver"
browser = webdriver.Chrome(chromePath)
url = 'https://us.testcompany.com/eng-us/women/handbags/_/N-r4xtxc/to-1'
browser.get(url)
hrefLinkArray = []
hrefElements = browser.find_elements_by_class_name("product-item")
for eachOne in hrefElements:
hrefLinkArray.append(eachOne.get_attribute('href'))
pics = [[]]
for y in range(0, len(hrefLinkArray)): # or type in "range(0, 1)" to debug
browser.get(hrefLinkArray[y])
productViews = browser.find_elements_by_xpath("// *[ @ id = 'lightSlider'] / li")
b = -1
for a in productViews:
b = b + 1
# print(y) for debugging
# print(b) for debugging
pics[y][b] = a.get_attribute('src') # <------------ ERROR!
# pics[y][b].append(a.get_attribute('src') GIVES SAME ERROR AS ABOVE
del productViews[:]
browser.quit()
每当我 运行 这个,我在 a in productViews
循环的第一次迭代中得到一个错误:
line 64, in <module>
pics[y][b] = a.get_attribute('src')
IndexError: list assignment index out of range
据我所知,整数引用是正确的(请参阅我在 for a in productViews
循环中的调试行),因此 pics[0][0]
是引用锯齿状列表的正确方法。这么一说,我有种pics[0][0]
还不存在的感觉?或者也许只有 pics[0]
可以?我看过关于此错误的类似帖子,但我理解的唯一解决方案似乎是使用 .append()
,即使如此,在一维列表中使用它。正如您在我的代码中看到的那样,我使用 .append()
表示 hrefLinkArray
成功 ,而它显示 不成功 在第 64/65 行。我很困惑为什么会这样。
请告诉我:
为什么我的行 .append()
和 [][]=...
会抛出此错误。
如果有更有效的方法来完成我的目标,我愿意学习!
更新:使用@User4343502 的回答,结合@StephenRauch 的输入,错误得到解决,我现在得到了预期大小的锯齿状列表!我修改后的代码是:
listOfLists = []
for y in range(0, len(hrefLinkArray)):
browser.get(hrefLinkArray[y])
productViews = browser.find_elements_by_xpath("// *[ @ id = 'lightSlider'] / li")
otherList = []
for other in productViews:
otherList.append(other.get_attribute('src'))
# print(otherList)
listOfLists.append(otherList)
del otherList[:]
del productViews[:]
print(listOfLists)
请注意,这段代码打印了一个锯齿状的列表,其中包含完全空的索引,例如[[][],[][][][],[],[][][],[][],[][][][][]...], 但这是一个单独的问题 - 我认为与我的 productViews
对象以及它如何通过 xpath
检索有关...不过,重要的是我最初的问题得到了回答。谢谢!
list.append
将一个元素添加到列表中。无论元素是什么,这都有效。
a = [1, 2, 3]
b = [float, {}]
c = [[[None]]]
## We will append to this empty list
list_of_lists = []
for x in (a, b, c):
list_of_lists.append(x)
## Prints: [[1, 2, 3], [<type 'float'>, {}], [[[None]]]]
print(list_of_lists)
所有,我正在尝试在 Python 3.x 中创建一个锯齿状列表。具体来说,我正在使用 Selenium 从网页列表中提取一些元素。我的锯齿状列表 ("matrix") 的每一行代表这些网页之一的内容。这些行中的每一行都应该有与其各自网页中提取的元素一样多的列 - 这个数字会因页面而异。
例如
webpage1 has 3 elements: a,b,c
webpage2 has 6 elements: d,e,f,g,h,i
webpage3 has 4 elements: j,k,l,m
...
看起来像:
[[a,b,c],
[d,e,f,g,h,i],
[j,k,l,m],...]
到目前为止,这是我的代码:
from selenium import webdriver
chromePath = "/Users/me/Documents/2018/chromedriver"
browser = webdriver.Chrome(chromePath)
url = 'https://us.testcompany.com/eng-us/women/handbags/_/N-r4xtxc/to-1'
browser.get(url)
hrefLinkArray = []
hrefElements = browser.find_elements_by_class_name("product-item")
for eachOne in hrefElements:
hrefLinkArray.append(eachOne.get_attribute('href'))
pics = [[]]
for y in range(0, len(hrefLinkArray)): # or type in "range(0, 1)" to debug
browser.get(hrefLinkArray[y])
productViews = browser.find_elements_by_xpath("// *[ @ id = 'lightSlider'] / li")
b = -1
for a in productViews:
b = b + 1
# print(y) for debugging
# print(b) for debugging
pics[y][b] = a.get_attribute('src') # <------------ ERROR!
# pics[y][b].append(a.get_attribute('src') GIVES SAME ERROR AS ABOVE
del productViews[:]
browser.quit()
每当我 运行 这个,我在 a in productViews
循环的第一次迭代中得到一个错误:
line 64, in <module>
pics[y][b] = a.get_attribute('src')
IndexError: list assignment index out of range
据我所知,整数引用是正确的(请参阅我在 for a in productViews
循环中的调试行),因此 pics[0][0]
是引用锯齿状列表的正确方法。这么一说,我有种pics[0][0]
还不存在的感觉?或者也许只有 pics[0]
可以?我看过关于此错误的类似帖子,但我理解的唯一解决方案似乎是使用 .append()
,即使如此,在一维列表中使用它。正如您在我的代码中看到的那样,我使用 .append()
表示 hrefLinkArray
成功 ,而它显示 不成功 在第 64/65 行。我很困惑为什么会这样。
请告诉我:
为什么我的行
.append()
和[][]=...
会抛出此错误。如果有更有效的方法来完成我的目标,我愿意学习!
更新:使用@User4343502 的回答,结合@StephenRauch 的输入,错误得到解决,我现在得到了预期大小的锯齿状列表!我修改后的代码是:
listOfLists = []
for y in range(0, len(hrefLinkArray)):
browser.get(hrefLinkArray[y])
productViews = browser.find_elements_by_xpath("// *[ @ id = 'lightSlider'] / li")
otherList = []
for other in productViews:
otherList.append(other.get_attribute('src'))
# print(otherList)
listOfLists.append(otherList)
del otherList[:]
del productViews[:]
print(listOfLists)
请注意,这段代码打印了一个锯齿状的列表,其中包含完全空的索引,例如[[][],[][][][],[],[][][],[][],[][][][][]...], 但这是一个单独的问题 - 我认为与我的 productViews
对象以及它如何通过 xpath
检索有关...不过,重要的是我最初的问题得到了回答。谢谢!
list.append
将一个元素添加到列表中。无论元素是什么,这都有效。
a = [1, 2, 3]
b = [float, {}]
c = [[[None]]]
## We will append to this empty list
list_of_lists = []
for x in (a, b, c):
list_of_lists.append(x)
## Prints: [[1, 2, 3], [<type 'float'>, {}], [[[None]]]]
print(list_of_lists)