![](/img/trans.png)
[英]Python: Finding a (string) key in a dictionary that contains a substring
[英]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.