搜索2D列表?

时间:2014-10-04 02:52:45

标签: python list multidimensional-array

我有一个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音乐列表比给定的示例

大得多

2 个答案:

答案 0 :(得分: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] ]

这将返回列表中与查询匹配的所有(艺术家,曲目)对。

答案 1 :(得分: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 ex变量:

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

现在您也可以按专辑查看。当然,您必须检查responsein ind,但这只是if声明...