如何解决空列表弹出错误?

时间:2019-09-28 07:40:27

标签: python-3.x

我的目标是创建一个包含{1:['c','b''a'],2:['c','b','a']}}的列表的字典

a_list = ['a,','b', 'c'] #some_dates
some_dict = dict([(i, []) for i in range(1, 4)]) #date_dict
a_list.reverse()
print(a_list)
for key in some_dict.keys():
    a = some_dict[key]
    while len(empty_list) < 14:
        a.append(a_list.pop())

some_dict

但是使用此代码,我得到以下错误消息。我不明白为什么一开始就已经明显创建了a_list,为什么我会从一个空列表中弹出错误?


---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-8-90ae0d4de7b6> in <module>
      6     a = some_dict[key]
      7     while len(a) < 4:
----> 8         a.append(a_list.pop())
      9 
     10 some_dict

IndexError: pop from empty list

1 个答案:

答案 0 :(得分:0)

您的代码打算将a_list弹出到您的字典中。

  • 但是您的while循环没有检查len(a_list),而是检查了错误的变量:len(empty_list) ,甚至没有定义! (始终在干净的会话中重新检查您的代码示例,然后再在此处发布您的问题。)

  • 无论如何,将循环的终止条件设为检查while len(a_list) < 14:甚至是没有意义的,因为这不会阻止a_list变空并且您尝试执行{{1 }}。您应该检查a_list.pop()。 (假设while len(a_list) > 0在循环中第一次是真实的,弹出操作只会使len(a_list) < 14变短,因此a_list将继续为真,即使{{1} },因此它不会阻止len(a_list) < 14。这不是您想要的。

  • 但是我们对Python中的这种迭代方法不满意,我们有 list comprehensions dict comprehensions 。您可以在一句话dict理解中做所有想做的事情:

    len(a_list) == 0

  • 这样更快,更干净,更清晰,几乎不可能写错。与IndexError: pop from empty list

  • 不同,它也不会破坏性地消耗您的输入
  • 无需声明另一个变量>>> {k: a_list for k in some_dict} {1: ['c', 'b', 'a,'], 2: ['c', 'b', 'a,'], 3: ['c', 'b', 'a,']}来保存要为a_list.pop()构建的列表。这还会导致另一个错误,因为您构建了临时a,但是在while循环完成之后,在使用下一个键进行for循环的另一次迭代之前,从未分配过some_dict[key]您要扔掉a(但是无论如何,如果直接将其编码为字典理解,并且没有像some_dict[key] = a这样的临时变量,就不会犯该错误。 )