2

我正在处理以下代码:

def findLine(prog, target):
   for l in range(0, len(prog)-1):
      progX = prog[l].split()
      for i in range(0, len(progX)):
         if progX[i] == target:
            a = progX[i]

...但我需要一种方法来查找 prog 的哪个索引包含 a。该程序的示例输入是:

findLine(['10 GOTO 20', '20 END'], '20')

问题本身应该比我自己解释得更好:
定义一个函数 findLine(prog, target) 来执行以下操作。假设 prog 是一个包含 BASIC 程序的字符串列表,例如 getBASIC() 生成的类型;假设 target 是一个包含行号的字符串,它是 GOTO 语句的目标。该函数应返回索引 i(一个介于 0 和 len(prog)-1 之间的数字),使得 prog[i] 是其标签等于 target 的行。

示例输入/输出:如果调用 findLine(['10 GOTO 20','20 END'], '10') 则输出应为 0,因为列表的第 0 项是标签为 10 的行。

那么,如何找到包含 ans 作为子字符串的第一个索引?提前感谢您的帮助。

4

3 回答 3

2

在我看来,你很接近...

def findLine(prog, target):
   for l in range(0, len(prog)):  #range doesn't include last element.
      progX = prog[l].split()
      #you probably only want to check the first element in progX
      #since that's the one with the label
      if progX[0] == target:
          return l  #This is the one we want, return the index

      #Your code for comparison
      #for i in range(0, len(progX)):
      #   if progX[i] == target:
      #      a = progX[i]

这部分可以使用以下方法更好地完成enumerate

def findLine(prog, target):
   for l,line in enumerate(prog):
      progX = line.split()
      if progX[0] == target:
          return l  #This is the one we want, return the index

如果你真的感兴趣,这可以在 python 的 1 行中完成:

def findLine(prog,target):
    return next(i for i,line in enumerate(prog) if line.split()[0] == target)

这条线有很多内容,但这是一个相当普遍的成语。它使用next带有“生成器表达式”的函数。

于 2013-04-04T20:16:08.030 回答
0

你跳过了最后一行。

Range 产生一系列直到但不包括第二个参数的所有内容:

>>> list(range(5))
[0, 1, 2, 3, 4]

看看有五个值但5不是其中之一吗?(如果第一个参数range0,你可以省略它。)

一种更 Pythonic 的方式来迭代某些东西但仍然能够知道索引是使用enumerate

for index, line in enumerate(prog):
    line_parts = line.split()
    for part in line_parts:
        if part == target:
            # Figure out what to do here.
            # Remember that 'index' is the index of the line you are examining.
于 2013-04-04T20:17:57.617 回答
-1
def iterfind (iterable, function):
    for i in enumerate(iterable):
        if function(i[1]): return i[0]
    return -1

def basic_linenumber_find (mylist, linenumber):
    return iterfind(mylist, lambda x: int(x.split()[0]) == linenumber)

basic_linenumber_find(['10 GOTO 20', '20 END'], 10)
于 2013-04-04T20:19:49.640 回答