2014-10-04 69 views
0

我有一個包含像這樣的音樂信息列表列表的2D名單:在2D列表中搜索?

tracks = [(The Beatles, Yellow Submarine), (Green Day, American Idiot)] 

我試圖做一個函數,會要求用戶輸入一個字符串,然後該函數將通過列出並顯示其內部字符串的所有內部列表。這是我目前無法使用的功能。

if response == "st": 
     st_search = raw_input("Search tracks: ") 
     return [ t for t in tracks if st_search in tracks ] 
    elif response == "sa": 
     sa_search = raw_input("Search artists: ") 
     return [ ar for ar in tracks if s_search in tracks ] 

如果有人明白我想要做什麼,並可以提供幫助,將不勝感激!

編輯:2D音樂列表比從具有無效語法您的第一個代碼段給出

回答

1

拋開例子非常大,你的搜索功能是大多數做的方式。在您的發電機,你應該覈對是否匹配當前條目,而不是整個列表:

if response == "st": 
    st_search = raw_input("Search tracks: ") 
    return [ t for t in tracks if st_search==t[1] ] 
elif response == "sa": 
    sa_search = raw_input("Search artists: ") 
    return [ t for t in tracks if sa_search==t[0] ] 

這將返回所有(藝術家,曲目)對從匹配查詢列表。

0

理想情況下,您不想將變量硬編碼到變量中。這樣,它可能變得禁止改變數據結構。您可以考慮下面的代碼:

ind = { 'sa': 0, 
     'st': 1 } 
st_search = raw_input("Search tracks: ") 
return filter(lambda m: m[ind[response]] == st_search , tracks) 

在這裏,如果從

tracks = [('The Beatles', 'Yellow Submarine'), 
      ('Green Day', 'American Idiot')] 

數據結構的變化

tracks = [('The Beatles', 'Yellow Submarine', 'Yellow Submarine'), 
      ('The Beatles', 'All Together Now', 'Yellow Submarine'), 
      ('Green Day', 'American Idiot', 'American Idiot' ), 
      ('Green Day', 'Jesus of Suburbia', 'American Idiot' ) 
      ] 

,你需要做的唯一的變化是在ind前變量通過:

ind = { 'sa': 0, 
     'st': 1, 
     'al': 2 } 

現在,您也可以按專輯進行檢查。當然,你必須檢查responsein ind,但這只是一個額外的if聲明...