Python 3 - 查找列表的哪个索引包含特定字符串作为子字符串

时间:2013-04-04 20:07:34

标签: python list python-3.x

我正在处理以下代码:

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]

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

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作为子字符串的第一个索引?提前感谢您的帮助。

3 个答案:

答案 0 :(得分: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函数和“生成器表达式”。

答案 1 :(得分:0)

你正在跳过最后一行。

Range生成一系列所有内容,但不包括第二个参数:

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

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

迭代某些但仍然能够知道索引的更加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.

答案 2 :(得分:-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)