2016-05-14 79 views
0

我期待着鞏固一個我知道可以改進的功能。動態搜索python列表

我有一系列全局列表,我將其添加到列表中,並定期添加列表數。

在此函數中,我可以搜索輸入字符並返回列表中的列表號和位置。不幸的是,每次我添加一個新列表時,我還必須添加一個新的嵌套try /除ValueError以及新的列表名稱。

我確信有人比我有更多的編碼經驗可以想出一種遞歸調用此函數和搜索的方式,而不嵌套這些。 理想情況下,我想我會指定有多少「Listx」列表使用接受字符串和整數的函數進行搜索?

def findInLists(inputString): 

    line = 0 
    output = 0 

    try: 
     output = List1.index(inputString) 
    except ValueError: 
     line += 1 
     try: 
      output = List2.index(inputString) 
     except ValueError: 
      line += 1 
      try: 
       output = List3.index(inputString) 
      except ValueError: 
       line += 1 
       try: 
        output = List4.index(inputString) 
       except ValueError: 
        output = -1 
    return str(line) + str(output) 
+0

有關使用嵌套列表是什麼? – Leva7

+0

你的意思是輸出= List.index(inputString)被輸出= List2.index(inputString) – PyNEwbie

回答

0

修改 - 所以你願意在搜索之前指定列表的固定數量:

def _search_lists(phrase,numb_of_lists): 
    for n in range(1, numb_of_lists + 1): 
     list_name = "list" + str(n) 
     list_to_search = eval(list_name) 
     if search phrase in list_to_search: 
      return n, list_to_search.index(search_phrase) 
    return 0,0 

返回的是列表號和索引位置,如果不是那麼任何列表(0 ,0)

請注意,許多人警告使用eval函數的危險,但在這種情況下,假設它是你的代碼,你應該沒問題。

+0

這是一個非常乾淨的方法 - 我沒有意識到我可以使用一個字符串來調用我生成的列表。 - 謝謝! –

+0

很久以前我有一個類似的問題http://stackoverflow.com/questions/7748596/can-i-variabalize-an-object-like-a-dictionary-reference-in-python – PyNEwbie

0

如果你只是想避免嵌套,使用早期return S:

def findInLists(inputString): 

    line = 0 
    output = 0 

    try: 
     output = List1.index(inputString) 
     return str(line) + str(output) 
    except ValueError: 
     line += 1 
    try: 
     output = List2.index(inputString) 
     return str(line) + str(output) 
    except ValueError: 
     line += 1 
    try: 
     output = List3.index(inputString) 
     return str(line) + str(output) 
    except ValueError: 
     line += 1 
    try: 
     output = List4.index(inputString) 
     return str(line) + str(output) 
    except ValueError: 
     output = -1 
    return str(line) + str(output) 

現在這仍然是一個很多重複的邏輯,是不是?但現在更容易將其重構爲for -loop。您澄清後

0

您實際上想要搜索列表的列表。所以你應該列出一個列表,而不是在變量名上使用後綴。

所以這些方針的東西應該適合你的需求:

def find_it(lists, val): 
    idxVal = -1 
    idxList = -1 
    for l in lists: 
     try: 
      f = l.index(val) 
     except: 
      pass 
    return idxList, idxVal 

listIndex, valueIndex = find_it([List1, List2, List3], "foo") 

當然這只是許多可能的解決方案之一(你可以做到這一點遞歸,尾部第一,使用reduce(),等等等等)

一般來說,如果你覺得你有許多相同類型的東西,你應該使用列表。後綴變量名稱是一種代碼味道。

0

我會做這樣的事情:

list1= ["foo"]; 
list2= ["foo"]; 
list3= ["foo"]; 
list4= ["foo", "baz"]; 

def findInLists(inputString): 
    lists = [list1, list2, list3, list4]; 
    output = -1; 
    for i, each in enumerate(lists): 
     try: 
      output = each.index(inputString) 
      break 
     except ValueError: 
      pass 
    return str(i+1) + str(output) 

試試看:https://repl.it/CQn3/3