繁体   English   中英

试图从字典中的列表中保存数据(以更Python化的方式)

[英]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_predictionfor循环和理解之前,你会发现它是指在最后一项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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM