2014-10-04 5 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 ] 

Если кто-то понимает, что я пытаюсь сделать и могу помочь, был бы признателен!

EDIT: музыка список 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 } 

И теперь вы можете проверить по альбому. Конечно, вам нужно будет проверить, что response - in ind, но это всего лишь if ...