对于我正在处理的应用程序,我需要从嵌套元组创建列表,以表示每个分支中包含的数据。从嵌套元组中提取数据
,以供参考元组代表霍夫曼树,一个例子是:
tree = (1.0, (0.5, (0.25, (0.125, 'd'),(0.125, 'c')), (0.25, 'b')), (0.5,'a'))
这是从霍夫曼程序创建如下概率:
a:0.5, b:0.25, c:0.125, d:0.125
我想出去放列表看起来像
[['a'],['b','c','d']]
我试过下面的代码:
def makeList(tree):
if len(tree) == 2:
return [tree[0]]
else:
rightlist = []
leftlist = []
right = list(tree[1])
left = list(tree[2])
for i in range(1, len(right)):
rightlist.append(right[i])
for i in range(1, len(left)):
leftlist.append(left[i])
return [rightlist, leftlist]
然而,这将返回
[['a'],[(0.25, (0.125, 'd'),(0.125,'c')),(0.25,'b')]
这是不太我想要的。
我怎么能修改我的代码来产生我想要的输出?
EDIT
我已经产生一些代码,给定的一个平衡的输入:
('a',0.25), ('b', 0.25), ('c', 0.25), ('d',0.25)
产生欲输出:
[['a','b'], ['c','d']]
def makeList(tree):
if len(tree) == 2:
print("I'm in here")
return [tree[1]]
else:
right = tree[1]
left = tree[2]
rightlist = []
leftlist = []
for i in range(0, len(right)):
if type(right[i]) == tuple:
print('right: ' + str(right[i]))
rightlist.append(right[i][1])
for i in range(0, len(left)):
if type(left[i]) == tuple:
print('left: ' + str(left[i]))
leftlist.append(left[i][1])
return [rightlist, leftlist]
然而,在下列输入失败(输出如下):
exampleData = [(0.5, 'a'), (0.5,'b')]
[[],[[]]
exampleData = [(0.5, 'a'), (0.25,'b'), (0.25,'c')]
[[],['b'.'c']]
exampleData = [(0.5,'a'), (0.25,'b'), (0.125,'c'), (0.125,'d')]
[[]],['b',(0.125, 'd')]]
但是,黄金标准测试,这需要通过对随机树创建这些列表:
probs = np.random.dirichlet([1]*4).tolist()
indices = range(0,4)
exampleData = zip(probs, indices)
huffTree = makeHuffmanTree(exampleData)
groups = makeLists(groups)
这是实际的代码吗?我认为这是len不是长度,for循环最后需要冒号 – doctorlove
你能解释一下你是如何确定你想输出的吗?[[''a'],['b','c','d']] '?为什么'b'与'c'和'd'在同一个列表中,当它具有不同的概率? – Kevin
@doctorlove是的,当然。已添加冒号并删除第一长度。 –