Ver*_*int 2 python list-comprehension
对于家庭作业,我们需要创建一个函数,它接受两个输入(列表和一个字符串)并返回一个列表.我想使用list comprehension编写这个函数,但是一直遇到一个烦人的问题.这是他想要重写的原创函数:
index = [['keyword1', ['url1', 'url2', 'url3']], ['keyword2', ['url4', 'url5']]...]
def lookup(index, keyword):
result = []
for entry in index:
if entry[0] == keyword:
result += entry[1]
return result
Run Code Online (Sandbox Code Playgroud)
这些是我尝试使用列表理解:
def lookup(index, keyword):
return [entry[1] for entry in index if entry[0] == keyword]
def lookup(index, keyword):
return [ulist for key, ulist in index if i == keyword]
Run Code Online (Sandbox Code Playgroud)
最后......
def lookup(index, keyword):
return [j for j in (entry[1] for entry in index if entry[0] == keyword)]
Run Code Online (Sandbox Code Playgroud)
这里的问题是它在列表中的列表中返回所需的URL,如下所示:
[['url1', 'url2', 'url3']]
Run Code Online (Sandbox Code Playgroud)
而不是所需的格式:
['url1', 'url2', 'url3']
Run Code Online (Sandbox Code Playgroud)
我想过做这样的事情(在return语句的末尾加上[0],所以它给了我内部列表):
def lookup(index, keyword):
return [j for j in (entry[1] for entry in index if entry[0] == keyword)][0]
Run Code Online (Sandbox Code Playgroud)
但它似乎不是正确的方式.我是否尝试不必要地使用列表理解(我的理解是这种情况非常适合列表理解)?有什么建议?
这将是最直接的方式:
def lookup(index,keyword):
return [x for entry in index if entry[0]==keyword for x in entry[1]]
Run Code Online (Sandbox Code Playgroud)
嵌套列表推导语法不是您最初期望的.关键是要意识到使用两个for循环不是两个单独的列表推导,而是一个具有嵌套循环的列表理解.这就是为什么它有效.就像你在写作一样
for entry in index:
if entry[0]==keyword:
for x in entry[1]:
yield x
Run Code Online (Sandbox Code Playgroud)
列表推导中的顺序与常规循环中的顺序相同,除了首先出现的结果值.