2013-04-04 58 views
2

我正在下面的代碼:的Python 3 - 查找其列表索引包含一個特定的字符串作爲一個子

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]是其標籤等於目標的行。

樣品輸入/輸出:如果調用 findLine([ '10 GOTO 20', '20 END'], '10') 則輸出應該是0,因爲該列表的項目0是與線標籤10.

那麼,如何找到第一個包含ans作爲子串的索引?預先感謝您的幫助。

回答

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 

如果你是真正的興趣,這可能是在1號線做在python:

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

有很多在該行怎麼回事,但它是一個相當普遍的我DIOM。它使用帶有「生成器表達式」的next函數。

+0

謝謝,先生。 – Dan 2013-04-04 20:21:22

+0

你也可以使用'line.startswith(target)'而不是'line.split()[0] == target' – gonz 2013-04-04 20:26:09

+0

@gonz - 我想過這個,但我不知道BASIC以及它是如何處理的聲明標籤。我看到的'startswith'的問題是:1)我不知道標籤前是否有空白,2)在100行中搜索10將返回True ... – mgilson 2013-04-04 20:33:10

0

您正在跳過最後一行。

範圍產生的一切序列直到但不包括第二個參數:

>>> 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. 
-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) 
+0

我不喜歡返回'-1'這樣的事情爲'-1'是列表的完全可以接受的指數 - 但它不會給你你想要的元素。 – mgilson 2013-04-04 20:21:17

+0

那麼,如果你想,你可以做一些不同的事情,比如拋出IndexError。 – Hammerite 2013-04-04 20:24:19

+0

基本上我想要與字符串find()方法相似。 – Hammerite 2013-04-04 20:26:02

相關問題