我想使用列表推导而不是使用嵌套的for循环。如何使用列表推导来表示以下结构?
word_list = ['cat','dog','rabbit']
letter_list = [ ]
for a_word in word_list:
for a_letter in a_word:
letter_list.append(a_letter)
我试过
letter_list = [letter for letter in word for word in word_list]
但是这会返回错误:
NameError: name 'word' is not defined
这样做的正确方法是什么?谢谢!
答案 0 :(得分:3)
你必须反过来做这件事:交换迭代:
[letter for word in word_list for letter in word]
# \_ __/ \_________ _________/ \________ _______/
# v v v
# yield outer loop inner loop
因此,您需要按照命令式样式定义for
循环的顺序定义for
循环。过滤器(列表推导中的if
s)也是如此。这些也必须以相同的顺序编写。
我们的想法是,如果您从左到右阅读for <pat> in <iter>
,则必须在使用这些<iter>
之前定义<pat>
(例如在 $('.btnEditUser').click(function () {
console.log('btn edit user clicked')
var rowUser = $(this).parent()
var rowUserData = rowUser.find(":input").val()
var oForm = new FormData()
oForm.append("rowUserData", rowUserData)
console.log("oForm", oForm)
var sUrl = 'edit-user/'
console.log("sUrl ", sUrl);
$.post(sUrl, oForm, function (uData) {
console.log('SUCCESS')
})
})
**
燕鸥中)。