我有一个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音乐列表比给定的示例
大得多答案 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 }
现在您也可以按专辑查看。当然,您必须检查response
是in ind
,但这只是if
声明...