Python结构运算符澄清

时间:2013-03-11 01:18:34

标签: python data-structures

我遇到了一段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函数的整数值
  • 创建一个包含两个值和
  • 的列表
  • 将它作为单个容器附加到F [stage]列表的末尾?

其次,遵循上面代码的这一行部分让我感到难过。

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

我解释它的方式是

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

我是在正确的轨道上吗?

3 个答案:

答案 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中的任何列表都可以成为“锯齿状阵列”