[英]trying to save data from a list in a dictionary (in a more pythonic way)
当我尝试从列表列表中创建字典时,python仅在使用理解时才保存列表中最后一个列表中的信息。
prediction_dict = dict()
for user_prediction in sliding:
for cur_loc, prediction_list in user_prediction:
prediction_dict[(cur_loc.user, cur_loc.time)] = prediction_list
print prediction_dict
如何通过列表理解以更Python的方式实现这一目标?
我试试这个:
prediction_dict = {(cur_loc.user, cur_loc.time): prediction_list for cur_loc, prediction_list in user_prediction for user_prediction in sliding}
但是它只保存列表中最后一个列表的数据吗?
为什么?
正如其他人提到的那样,您的理解不起作用,因为需要切换for
语句。 但是,有一个简单的原因可以说明您的代码为何执行其所执行的操作。 如果您这样做:
del(user_prediction) #Ensure we aren't using a previously defined version
prediction_dict = {(cur_loc.user, cur_loc.time): prediction_list for cur_loc, prediction_list in user_prediction for user_prediction in sliding}
然后,您将得到如下错误:
NameError: name 'user_prediction' is not defined
所以我猜想当你尝试的时候,你正在做这样的事情:
prediction_dict = dict()
for user_prediction in sliding:
for cur_loc, prediction_list in user_prediction:
prediction_dict[(cur_loc.user, cur_loc.time)] = prediction_list
print prediction_dict
prediction_dict = {(cur_loc.user, cur_loc.time): prediction_list for cur_loc, prediction_list in user_prediction for user_prediction in sliding}
print prediction_dict
如果您打印的价值user_prediction
后for
循环和理解之前,你会发现它是指在最后一项sliding
。 这不会有问题,除了从NameError
我们看到的那样,您所拥有的理解力试图使用旧值而不是您想要赋予的新值。 幕后发生的事情是这样的:
prediction_dict = {}
loop_one_input = user_prediction
for cur_loc, prediction_list in loop_one_input:
loop_two_input = sliding
for user_prediction in loop_two_input:
prediction_dict[(cur_loc.user, cur_loc.time)] = prediction_list
如您所见,在将user_prediction
重新分配给新值时(在内部for
循环中),外部for
循环已在使用旧值。 这不完全是正在发生的事情,但是希望它能给您一个足够好的主意,以了解您的字典理解为何无法正常工作。
当将嵌套的for循环转换为嵌套列表理解时,外部循环需要首先出现,因此看起来您只需要在理解内切换迭代的顺序即可(为清楚起见,分成多行:
prediction_dict = {(cur_loc.user, cur_loc.time): prediction_list
for user_prediction in sliding
for cur_loc, prediction_list in user_prediction}
您几乎已经明白了,在理解中更改for语句的顺序:
prediction_dict = {(cur_loc.user, cur_loc.time): prediction_list
for user_prediction in sliding
for cur_loc, prediction_list in user_prediction}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.