簡體   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