[英]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不會自動為您提供。 如官方文檔中所述,列表推導總是返回一個列表,這就是元組在列表中的原因。
讓我們舉個例子:當我給出一個字母和一個列表時,返回函數將給出列表中以該字母開頭的名稱。
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.