函数写入同一个字典或根本不写入
Function writing to the same dictionary or just not writing in it at all
我正在做一个 Huffman 项目,我有一个特定功能的问题。基本上,您从树中创建字典以获取新字典,其中字母作为键,霍夫曼代码作为值(0 和 1)。
顺便说一句,整个程序实际上显然要长得多,但为了方便您,我只放置了非工作功能,因为其余功能都按预期工作。
而“错误”是,当我多次调用我的函数时,它只会写入同一个字典并替换一些相同的键。我尝试将 codes = {} 放入函数本身或作为 args 但它会 return 一个空字典。
这是代码:
codes = {}
def parcours(arbre, chemin=""):
if arbre.gauche is None:
codes[arbre.valeur] = chemin
else:
parcours(arbre.gauche, chemin+"0")
parcours(arbre.droit, chemin+"1")
return codes
print(parcours(creer_arbre(creer_liste(dict_exemple))))
print(parcours(arbre_huffman("testpy.txt")))
这是 returns :
{'b': '00', 'a': '01', 'd': '100', 'e': '1010', 'f': '1011', 'c': '11'}
{'b': '00', 'a': '01', 'd': '100', 'e': '101', 'f': '1011', 'c': '11', ' ': '000', 'p': '001', 'r': '010', 'o': '011', 'j': '100', 't': '110', 'T': '1110', 's': '1111'}
字母仅来自示例词典,但结果清楚地表明第二个 运行 的开头与第一个 运行 相同。
对不起,如果它是法语的,但它应该很容易理解,chemin 是“路径”。 Parcours 就像导航树,arbre 是树,valeur 是值。
如果您在函数外部定义 codes
,则每个函数调用都会将其数据添加到同一个字典中。
您需要在函数内部定义 codes
,并确保用递归调用的结果更新它。
def parcours(arbre, chemin=""):
codes = {}
if arbre.gauche is None:
codes[arbre.valeur] = chemin
else:
codes.update(parcours(arbre.gauche, chemin+"0"))
codes.update(parcours(arbre.droit, chemin+"1"))
return codes
我正在做一个 Huffman 项目,我有一个特定功能的问题。基本上,您从树中创建字典以获取新字典,其中字母作为键,霍夫曼代码作为值(0 和 1)。
顺便说一句,整个程序实际上显然要长得多,但为了方便您,我只放置了非工作功能,因为其余功能都按预期工作。
而“错误”是,当我多次调用我的函数时,它只会写入同一个字典并替换一些相同的键。我尝试将 codes = {} 放入函数本身或作为 args 但它会 return 一个空字典。
这是代码:
codes = {}
def parcours(arbre, chemin=""):
if arbre.gauche is None:
codes[arbre.valeur] = chemin
else:
parcours(arbre.gauche, chemin+"0")
parcours(arbre.droit, chemin+"1")
return codes
print(parcours(creer_arbre(creer_liste(dict_exemple))))
print(parcours(arbre_huffman("testpy.txt")))
这是 returns :
{'b': '00', 'a': '01', 'd': '100', 'e': '1010', 'f': '1011', 'c': '11'}
{'b': '00', 'a': '01', 'd': '100', 'e': '101', 'f': '1011', 'c': '11', ' ': '000', 'p': '001', 'r': '010', 'o': '011', 'j': '100', 't': '110', 'T': '1110', 's': '1111'}
字母仅来自示例词典,但结果清楚地表明第二个 运行 的开头与第一个 运行 相同。
对不起,如果它是法语的,但它应该很容易理解,chemin 是“路径”。 Parcours 就像导航树,arbre 是树,valeur 是值。
如果您在函数外部定义 codes
,则每个函数调用都会将其数据添加到同一个字典中。
您需要在函数内部定义 codes
,并确保用递归调用的结果更新它。
def parcours(arbre, chemin=""):
codes = {}
if arbre.gauche is None:
codes[arbre.valeur] = chemin
else:
codes.update(parcours(arbre.gauche, chemin+"0"))
codes.update(parcours(arbre.droit, chemin+"1"))
return codes