我发现下面的代码有些混乱。
l1 = ['left', 'up', 'front']
l2 = ['right', 'down', 'back']
opposites=filter(lambda word: len(word[0]) > 3 and len(word[1]) >3, zip(l1,l2))
上面的代码应该从两个长度至少为3个字母的列表中获取单词,并使用列表理解将它们添加到一个列表中(相反)。
我不明白为什么我们这里有单词[0]和单词[1] ...“单词”是1个列表,而我们却得到前两个元素...
我对列表理解没有太多经验,但是有人可以向我详细解释一下这一部分...
谢谢!
答案 0 :(得分:0)
首先,此表达式不是列表理解。仅仅是对python中内置函数的使用。
但是我同意这段代码有点令人困惑。也许对功能进行快速回顾就可以了。
首先,函数zip(l1, l2)
汇总了2个列表的元素:
zip(l1, l2) = [ ('left', 'right'), ('up', 'down'), ('front', 'back') ]
第二,这里的关键字lambda
和函数filter
的所有第一个参数可以简化小函数的定义,因为您可以替换以下语句:
lambda word: len(word[0]) > 3 and len(word[1]) >3
通过这个,更容易理解:
def pred(word): # e.g. word = ("left", "right")
elem_l1 = word[0]
elem_l2 = word[1]
return len(elem_l1) > 3 and len(elem_l2) > 3
最后,函数filter(a, b)
将遍历b
的所有元素(例如,压缩列表),并在所有元素上启动函数a
(例如,lambda函数)。并根据您的功能结果。它将选择要返回并存储在变量opposites
中的元素。
所以最后,您显示的代码可以替换为以下代码:
l1 = ['left', 'up', 'front']
l2 = ['right', 'down', 'back']
opposites = []
def pred(word): # e.g. word = ("left", "right")
elem_l1 = word[0]
elem_l2 = word[1]
return len(elem_l1) > 3 and len(elem_l2) > 3
for word in zip(l1, l2):
if pred(word):
opposites.append(word)
PS:这并不完全正确,因为函数filter
不返回列表。但是,如果要按原样使用它,则必须将过滤后的语句包含在函数list()
中。
答案 1 :(得分:0)
@eliottness的其他答案很好地分解了filter和lambda操作。但是,OP希望在列表理解中做到这一点。列表理解的基本格式是
也就是说,这可行:
l1 = ['left', 'up', 'front']
l2 = ['right', 'down', 'back']
opposites = [(a, b) for (a, b) in zip(l1, l2) if len(a) > 3 and len(b) > 3]
print(opposites)
[('left', 'right'), ('front', 'back')]