我遇到了一段Python代码,我可能想要为个人项目适应Java,但是在理解操作方面遇到了一些困难。该代码段包含以下内容:
F={}
for stage in range(4):
if stage == 0:
F[stage]=[]
i=0
for j in range(i, len(words)+1):
F[stage].append([cost(i, j), 0])
这里,cost
是一个外部def,它接受两个整数值并返回一个数学运算。
据我所知,F={}
初始化一个类似于Java HashMap的dict,[]
表示列表的初始化。
首先,我是否认为F[stage].append([cost(i, j), 0])
意味着
cost
函数的整数值其次,遵循上面代码的这一行部分让我感到难过。
if F[stage-1][i][0] + cost(i, j) ...
我解释它的方式是
F[stage - 1]
检索位置[i]
访问子列表容器和[0]
检索子列表第一个索引位置的值我是在正确的轨道上吗?
答案 0 :(得分:2)
你问的那条线,
if F[stage-1][i][0] + cost(i, j) ...
似乎在考虑前一阶段的成本计算;它看起来几乎像寻找最佳下一步行动的路径算法。我说它是前一阶段的成本计算的原因(显然)是stage-1
索引,以及当[cost(i, j), 0]
附加到F[stage]
(列表)时,该列表的[0]
元素为cost(i, j)
。所以你说“[0]
检索子列表的第一个索引位置的值”是正确的,但它可能有助于知道它还专门检索了早期的成本结果。
在Java中,使用小类而不是2项列表来获取成本以及第二个参数是什么,使用适当命名的字段和访问器可能更为惯用。
你也可以使用数组代替F
的dict,因为虽然Python代码使用了dict,但它只是通过访问数字阶段键0-3来将其视为数组。
我想知道我们是否遗漏了您希望转换的某些上下文,特别是因为if F[stage-1] ...
行未包含在原始代码段中。
答案 1 :(得分:1)
首先,我是否正确F [stage] .append([cost(i,j),0])意味着
取成本函数的整数值, 创建一个包含两个值的列表 将它作为单个容器附加到F [stage]列表的末尾?
您的理解是正确的。 F [stage]将是一个列表列表。
我解释它的方式是
F [stage - 1]检索位置
的列表
[i]访问子列表容器和
[0]检索子列表的第一个索引位置的值
在我看来
F [stage]是该结构的列表清单:
[[什么成本(i,j)返回,0],[什么成本(i,j)返回,0] ....]
从这里我是0(或它改变?)
F [stage-1] [i] [0]指最后阶段的成本(0,0)
这似乎是为了确定某些事情而将最后阶段的成本添加到当前阶段。
答案 2 :(得分:0)
您在理解python代码时所做的评论是正确的。当然,这取决于代码正在做什么的上下文。但是对于Python的Dictionary / List结构,你可以用这样的简单字典开始
>>> tst = {'one':1, 'two':2}
>>> tst
{'two': 2, 'one': 1}
现在用一个嵌套列表
替换'one'的值>>> tst['one'] = [1, ['a', 'b', 'c'], 3]
>>> tst
{'two': 2, 'one': [1, ['a', 'b', 'c'], 3]}
现在转到嵌套列表中的'c'
>>> tst['one'][1][2]
'c'
你可以通过添加更多嵌套数组来更进一步。如果我没有弄错,Python中的任何列表都可以成为“锯齿状阵列”