我的目标是创建一个包含{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
答案 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
这样的临时变量,就不会犯该错误。 )