【问题标题】:dictionary.copy() seems to reference to the same memory locationdictionary.copy() 似乎引用了相同的内存位置
【发布时间】:2021-11-19 23:05:15
【问题描述】:

我试图在 python 中编写一个修改字典字典的代码,因此如果内部字典值是从 pandas.DataFrame 获得的 NaN,则删除内部字典的键,但对于一个原因,代码一直显示这个错误

RuntimeError:字典在迭代期间改变了大小

即使我在迭代之前确实将字典复制到另一个变量以避免出现以下代码中出现的任何并发症

def xls_to_dict_of_dict(filename):
    df = pd.read_excel(filename)
    df.fillna("NotaNumber", inplace=True)
    dict_of_dicts = {}
    try:
        for index, row in df.iterrows():
            dict_of_dicts[row[1]] = {}
            for i in range(2, len(row)):
                dict_of_dicts[row[1]][row[i]] = df.iloc[index + 1][i]
    except:
        pass
    return dict_of_dicts


if __name__ == '__main__':
    dict_of_dicts = xls_to_dict_of_dict('Excel.xlsx')

    dict_of_dictsTemp = dict_of_dicts.copy()
    for k, v in dict_of_dictsTemp.items():
        for k2, v2 in v.items():
            if v2 == "NotaNumber":
                dict_of_dicts[k].pop(k2)
    for k, v in dict_of_dicts.items():
        for k2, v2 in v.items():
            print(k2, v2)

【问题讨论】:

    标签: python pandas dictionary data-manipulation


    【解决方案1】:

    语句dict_of_dicts[k].pop(k2) 正在修改子字典,它与循环中的v 相同:

    dict_of_dictsTemp = dict_of_dicts.copy()
    for k, v in dict_of_dictsTemp.items():
        for k2, v2 in v.items():
            assert v is dict_of_dicts[k]
    

    您实际上不需要创建顶级字典的副本,因为您不修改该字典,只需为子字典复制items

    for k, v in dict_of_dicts.items():
        for k2, v2 in list(v.items()): # here using list to keep all keys 
            if v2 == "NotaNumber":
                v.pop(k2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-03
      • 2014-04-08
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 2016-09-19
      相关资源
      最近更新 更多