嵌套字典键被覆盖

时间:2018-11-19 09:47:25

标签: python

我想通过for循环创建一个嵌套的字典。所有客户和类别键均按预期方式创建(i和j),但是对于product_categories仅写入最后一个键。我知道它可能会被覆盖,但是我不明白为什么?

top_10_recs = {}

for i, j, k in itertools.product(customers, categories, product_categories):
    if i not in top_10_recs:
        top_10_recs[i] = {}
    if j not in top_10_recs:
        top_10_recs[i][j] = {}
    if k not in top_10_recs:
        top_10_recs[i][j][k] = {}
    try:
        top_10_recs[i][j][k] = trained_dataframe.loc[(i, j), k].nlargest(10).to_dict()
    except:
        pass

如果我以此打印:

for i, j, k in itertools.product(customers, categories, product_categories):
    try:
        print("{}".format(k))
        print(trained_dataframe.loc[(i, j), k].nlargest(10))

我得到了预期的结果,遍历了所有product_categories。

1 个答案:

答案 0 :(得分:1)

如果在词典中不存在新键,则仅在它们内部创建新键时要小心。下面的代码段应该可以使用。

if i not in top_10_recs:
    top_10_recs[i] = {}
if j not in top_10_recs[i]:
    top_10_recs[i][j] = {}
if k not in top_10_recs[i][j]:
    top_10_recs[i][j][k] = {}

还考虑使用except KeyError而不只是使用except,它会捕获所有可能的错误(您不希望这样)。