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

时间:2012-05-06 01:48:56

标签: 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

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

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]

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

6 个答案:

答案 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不会自动为您提供。正如官方文档中所描述的,列表推导总是返回一个列表,这就是元组在列表中的原因。

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

答案 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) )