python list comprehension:返回字符串列表而不是列表列表

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)

但它似乎不是正确的方式.我是否尝试不必要地使用列表理解(我的理解是这种情况非常适合列表理解)?有什么建议?

Vau*_*ato 7

这将是最直接的方式:

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)

列表推导中的顺序与常规循环中的顺序相同,除了首先出现的结果值.