0

我遇到了一段 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是一个外部定义,它接受两个整数值并返回一个数学运算。

据我所知,F={}初始化一个dict,它类似于Java HashMap,并[]表示一个列表的初始化。

首先,我是否正确,这F[stage].append([cost(i, j), 0])意味着

  • cost取函数的整数值,
  • 创建一个包含两个值的列表和
  • 将其作为单个容器附加到 F[stage] 列表的末尾?

其次,上面代码后面的这行部分让我很难过。

if F[stage-1][i][0] + cost(i, j) ...

我解释它的方式是

  • F[stage - 1]检索该位置的列表
  • [i]访问子列表容器和
  • [0]检索子列表的第一个索引位置的值

我在正确的轨道上吗?

4

3 回答 3

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 项列表来表示成本和第二个参数是什么,使用适当命名的字段和访问器可能更习惯用语。

您也可以使用数组而不是 dict for F,因为尽管 Python 代码使用 dict,但它仅通过访问数字阶段键 0-3 将其视为数组。

不过,我想知道我们是否遗漏了一些您希望转换的上下文,特别是因为该if F[stage-1] ...行未包含在原始代码段中。

于 2013-03-11T01:48:17.020 回答
1

首先,我是否纠正了 F[stage].append([cost(i, j), 0]) 的意思

取成本函数的整数值,创建一个包含两个值的列表并将其作为单个容器附加到 F[stage] 列表的末尾?


你的理解是正确的。F[stage] 将是一个列表列表。


我解释它的方式是

F[stage - 1] 检索位置
[i] 的列表访问子列表容器,
[0] 检索子列表第一个索引位置的值


在我看来,F[stage] 是一个列表列表,具有这种结构:
[[cost(i, j) 返回什么,0],[cost(i, j) 返回什么,0]....]
由于这里的 i 是 0(或者它会改变吗?) F[stage-1][i][0] 是指最后阶段的成本(0, 0)
它似乎是在将一些最后阶段的成本添加到当前阶段确定某事。

于 2013-03-11T01:31:56.587 回答
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 中的任何列表都可以变成“锯齿状数组”

于 2013-03-11T01:59:56.023 回答