繁体   English   中英

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

[英]Python 3 - Finding which index of a list contains a particular string as a substring

我正在处理以下代码:

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]

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

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

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

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

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

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

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函数。

您正在跳过最后一行。

Range产生一个序列,直到但不包括第二个参数:

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

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

迭代某些东西但仍然能够知道索引的更Python方式是使用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.
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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM