试图从字典中的列表中保存数据(以一种更具python风格的方式)

试图从字典中的列表中保存数据(以一种更具python风格的方式),python,list,python-2.7,dictionary,list-comprehension,Python,List,Python 2.7,Dictionary,List Comprehension,当我试图从列表中创建字典时,当我使用理解时,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 predictio

当我试图从列表中创建字典时,当我使用理解时,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
我怎样才能以一种更为通俗的方式,通过列表理解来实现这一点

我试试这个:

prediction_dict = {(cur_loc.user, cur_loc.time): prediction_list for cur_loc, prediction_list in user_prediction for user_prediction in sliding}
但它只保存列表中最后一个列表的数据


为什么?

当将嵌套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}

您几乎已经了解了,请更改理解中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}

正如其他人提到的,您的理解不起作用,因为需要切换
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
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
所以我猜当你在哪里尝试的时候,你是在做这样的事情:

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
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
如果您在
for
循环之后和理解之前打印
user\u prediction
的值,您会发现它引用了
slide
中的最后一个条目。这不会是一个问题,除了
NameError
之外,我们可以看到您的理解正在尝试使用旧值而不是新值你想赋予它的价值。幕后发生的事情是这样的:

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
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\u prediction
被重新分配到一个新值时(在
for
循环的内部)外部
for
循环已经在使用旧值。这并不是实际发生的情况,但希望它能让您充分了解词典理解不正确的原因。

正如其他人所提到的,您的理解不起作用,因为
for
语句需要使用switc但是,有一个简单的原因可以解释为什么您的代码正在做它正在做的事情。如果您这样做:

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
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
所以我猜当你在哪里尝试的时候,你是在做这样的事情:

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
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
如果您在
for
循环之后和理解之前打印
user\u prediction
的值,您会发现它引用了
slide
中的最后一个条目。这不会是一个问题,除了
NameError
之外,我们可以看到您的理解正在尝试使用旧值而不是新值你想赋予它的价值。幕后发生的事情是这样的:

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
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\u prediction
被重新分配到一个新值时(在
for
循环的内部)外部
for
循环已经在使用旧值。这并不完全是实际情况,但希望它能让您充分了解词典理解功能不正常的原因。

您能给出一个滑动
的示例吗?请记住,理解功能并不总是正确的比循环更“pythic”。如果理解非常冗长或复杂,一个循环可能更容易阅读,因此更为复杂。(当然,对于过于冗长或复杂的事物,人们的看法是不同的。有些人会认为你的例子已经太过冗长而无法理解。)你能举一个例子说明一下滑动的样子吗?请记住,理解并不总是比循环更“通顺”。如果理解非常冗长或复杂,那么循环可能更容易阅读,因此也更通顺。(当然,对于什么是“太冗长或复杂”有不同的看法。)“有些人会认为你的例子已经太过冗长而难以理解。我真的很喜欢你花时间去解释正在发生的事情,而不是仅仅是一个快速的“你打算做这件事”。(已经值得我投票了。)我不在100%个段落上卖掉,从“但是,这意味着…”开始。“早期版本的
user\u prediction
”并不是因为我认为这是错误的,只是因为它仍然让我感到困惑。我不知道您是在代码的显式循环部分还是在代码的理解部分谈论某些内容。(当然,OP并没有让这变得容易!)@约翰尼:你是对的,那一段相当令人困惑。它现在看起来清楚了吗?好多了!可能没有写下任何痕迹,也没有做十倍长的回答。我真的很喜欢你花时间试图解释发生了什么,而不是简单地说一句“你是想这样做的”。(已经值得我投上一票)我对以“然而,这意味着……”开头,以“先前版本的
user\u prediction
结尾的段落没有100%的认同。“不是因为我认为这是错误的,只是因为它仍然让我感到困惑。我不知道你在代码的显式循环部分或代码的理解部分谈论什么。(当然,OP并没有让这变得容易!)@约翰尼:你是对的,那一段相当令人困惑。现在看起来清楚了吗?好多了!可能是最好的一段,但实际上没有写下一点痕迹,也没有把这个答案延长十倍。