簡體   English   中英

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

[英]python list comprehension: return a list of strings instead of a list of lists

對於家庭作業,我們需要創建一個函數,該函數接受兩個輸入(列表和字符串)並返回一個列表。 我想使用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]

但它似乎不是正確的方式。 我是否嘗試不必要地使用列表理解(我的理解是這種情況非常適合列表理解)? 有什么建議么?

這將是最直接的方式:

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

列表推導中的順序與常規循環中的順序相同,除了首先出現的結果值。

您應該使用字典,因為它的API更適合於與地圖相關的談話(並快速處理)事物。

keywordToUrl = {keyword1:(url1,url2,url3), keyword2:(url4,url5), ...}
keywordToUrl[keyword]
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']
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)

對於之前的不便,我深表歉意。 我已經測試了你的代碼,如果你看一下索引列表,你的值不統一:

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/

讓我們舉個例子:當我給出一個字母和一個列表時,返回函數將給出列表中以該字母開頭的名稱。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM