【问题标题】:Convert pascal to python将帕斯卡转换为 python
【发布时间】:2018-06-19 07:39:35
【问题描述】:

我有以下 Pascal 例程:

function TForm1.ldExtractFromLine (ldline: String; Post: Integer): String;
var
  s: String;
  t: array[1..15] of String;
  i, iT: Integer;
begin
  s := Trim(ldline);
  iT := 1;
  while s <> '' do
  begin
    s := Trim(s) + ' ';
    i := 1;
    while s[i] <> ' ' do Inc(i);
    t[iT] := Copy(s, 1, i-1);
    Inc(iT);
    s := Copy(s, i, Length(s));
  end;
  ldExtractFromLine := '';
  if Post < iT then ldExtractFromLine := t[Post];
end;

我正在尝试转换为 Python。这是我目前所拥有的:

def ldExtractFromLine (ldline, post):
    post -= 1    # mjh
    t = []

    s = ldline.strip()
    iT = 0;    # mjh
    while s <> '':
        s = s.strip() + ' '
        i = 0    # mjh
        while s[i] <> ' ': i += 1
#         t[iT] = Copy(s, 1, i-1)
#         function Copy(const S: string; From: integer = 1; Count: integer = MaxInt): string;
        t.insert(iT, s[0:i-1+1])    # mjh
        iT += 1
        s = s[i:(i+len(s)+1)]
        print "lala"

    result = ''
    if post < iT: result = t[post]    # mjh
    return result

但是,执行例程会导致无休止的“lala”打印到标准输出。问题是 Pascal 列表从索引 1 开始,而 Python 列表从索引 0 开始。这真的让我很困惑。谁能找到我的错误?变量post 是一个通常小于20 的整数。变量ldline 是一个字符串,看起来有点像“1 0 60 -24 -160 1 0 0 0 1 0 0 0 1 3001.dat”。

[编辑]

整个脚本可以在这里查看:

https://github.com/Jeremy1980/LDBoxer

这里是一些示例输入数据:

0 Safe House
0 Name: building_013_safehouse.ldr
0 Author: Kevin Loch
0 ROTATION CENTER 0 0 0 1 "Custom"
0 ROTATION CONFIG 0 0
1 0 60 -24 -160 1 0 0 0 1 0 0 0 1 3001.dat
1 0 60 -24 -160 1 0 0 0 1 0 0 0 1 3001.dat
1 0 -20 -24 -160 1 0 0 0 1 0 0 0 1 3001.dat
1 0 -20 -24 -160 1 0 0 0 1 0 0 0 1 3001.dat
1 0 -100 -24 -160 1 0 0 0 1 0 0 0 1 3001.dat
1 0 -100 -24 -160 1 0 0 0 1 0 0 0 1 3001.dat
1 0 -180 -24 -160 1 0 0 0 1 0 0 0 1 3001.dat
1 0 -180 -24 -160 1 0 0 0 1 0 0 0 1 3001.dat

更多输入数据的例子可以在这里找到:

https://github.com/Jeremy1980/LDBoxer/issues/4

【问题讨论】:

标签: python


【解决方案1】:

您的代码中的错误在以下行:

s = s[i:(i+len(s)+1)]

您在字符串s 中留下一个前导空格,这会导致无限循环,而(i+len(s)+1) 部分是错误的。它可以替换为:

s = s[i+1:]

一般来说,这个 pascal 函数只是简单地拆分字符串并获取Post-th 元素(从 1 开始)。相当于是这样的:

def ldExtractFromLine (ldline, post):
    a = ldline.split()
    if post <= len(a):
        return a[post-1]
    return ''   

【讨论】:

  • 如果ldline.split()[post-1] 满足您的需求,则无需真正定义函数。如果程序需要提取多个帖子,程序或许应该只拆分ldline 一次并将值保存在一个数组中,但我们当然不知道这种重构是否可行或必要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多