对于家庭作业,我们需要创建一个接受两个输入(列表和字符串)并返回列表的函数。我想使用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
这些是我尝试使用列表理解:
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]
但它似乎不是正确的方式。我是否尝试不必要地使用列表理解(我的理解是这种情况非常适合列表理解)?有什么建议吗?
答案 0 :(得分: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
列表推导中的顺序与常规循环中的顺序相同,除了首先出现的结果值。
答案 1 :(得分:3)
您应该使用字典,因为它的API更适合谈论(并快速处理)与地图相关的事物。
keywordToUrl = {keyword1:(url1,url2,url3), keyword2:(url4,url5), ...}
keywordToUrl[keyword]
答案 2 :(得分: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']
答案 3 :(得分: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)
答案 4 :(得分: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不会自动为您提供。正如官方文档中所描述的,列表推导总是返回一个列表,这就是元组在列表中的原因。
答案 5 :(得分: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) )