3

对于家庭作业,我们需要创建一个函数,该函数接受两个输入(列表和字符串)并返回一个列表。我想使用列表理解来编写这个函数,但是遇到了一个烦人的问题。这是我想重写的原始函数:

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

这些是我使用列表理解的尝试:

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]

最后...

def lookup(index, keyword):
    return [j for j in (entry[1] for entry in index if entry[0] == keyword)]

这里的问题是它在列表内的列表中返回所需的 url,如下所示:

[['url1', 'url2', 'url3']]

而不是所需的格式:

['url1', 'url2', 'url3']

我想做这样的事情(在 return 语句的末尾添加 [0] 以便它给我内部列表):

def lookup(index, keyword):
        return [j for j in (entry[1] for entry in index if entry[0] == keyword)][0]

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

4

6 回答 6

7

这将是最直接的方法:

def lookup(index,keyword):
    return [x for entry in index if entry[0]==keyword for x in entry[1]]

嵌套列表理解语法可能不是您最初所期望的。关键是要意识到使用两个 for 循环不是两个单独的列表推导,而是一个带有嵌套循环的列表推导。这实际上就是它起作用的原因。就像你在写

for entry in index:
  if entry[0]==keyword:
    for x in entry[1]:
      yield x

列表推导中的顺序与常规循环中的顺序相同,但产生的值位于第一位。

于 2012-05-06T02:02:55.183 回答
3

您应该改用字典,因为它的 API 更自然地适合谈论(和快速处理)与地图相关的事情。

keywordToUrl = {keyword1:(url1,url2,url3), keyword2:(url4,url5), ...}
keywordToUrl[keyword]
于 2012-05-06T02:02:21.327 回答
1
def lookup(index, keyword):
    return sum((entry[1] for entry in index if entry[0] == keyword), [])

例子:

>>> index = [['keyword1', ['url1', 'url2', 'url3']], ['keyword2', ['url4', 'url5']]]
>>> lookup(index, 'keyword1')
['url1', 'url2', 'url3']
于 2012-05-06T04:32:28.130 回答
0
def lookup(index,keyword):
    return [j for j in (entry[1] for entry in index if entry[0] == keyword)]

问题是你在括号内返回了一些东西,因此你的值被返回到一个列表中,删除括号并解决问题。

这将是正确的代码:

def lookup(index,keyword):
    return j for j in (entry[1] for entry in index if entry[0] == keyword)
于 2012-05-06T01:54:15.247 回答
0

对于之前的不便,我深表歉意。我已经测试了您的代码,如果您查看索引列表,您的值并不统一:

index = [['keyword1', ('url1', 'url2', 'url3')], ['keyword2', ['url4', 'url5']]...]

这里index[0][1]有一个元组和index[1][1]一个列表。

如果您在索引内创建列表的所有第二个值,则会发生以下情况:

这是与您的代码相同的代码:

index = [["keyword1", ("url1", "url2", "url3")], ["keyword2", ("url4", "url5")]]
def lookup(index, keyword):
    return [entry[1] for entry in index if entry[0] == keyword]

print lookup(index,"keyword1")

这是输出:

[('url1', 'url2', 'url3')]

您会注意到这不是列表中的列表,因为index[i][1]现在所有值都是元组。

如果你想要这个输出:

['url1', 'url2', 'url3']

您需要将该元组转换为列表,Python 不会自动为您提供该列表。如官方文档中所述,列表推导总是返回一个列表,这就是元组在列表中的原因。

http://www.python.org/dev/peps/pep-0202/

于 2012-05-06T02:31:00.113 回答
0

让我们举个例子:当我给出一个字母和一个列表时,返回函数将给出列表中以该字母开头的名称。

def abc(letter , nameslist):
    return [name for name in nameslist if name[0].lower() == letter.lower() ]


nameslist = ["Sou", "Soudipta", "Gini", "Protijayi", "Gina"]

print( abc("P",nameslist) )
于 2018-05-02T08:04:55.503 回答