我正在处理以下代码:
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作为子字符串的第一个索引?提前感谢您的帮助。
答案 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)