创建锯齿状数组时列出超出范围的索引

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 行。我很困惑为什么会这样。

请告诉我:

  1. 为什么我的行 .append()[][]=... 会抛出此错误。

  2. 如果有更有效的方法来完成我的目标,我愿意学习!

更新:使用@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)

Try it Online!