列表理解-从不同列表中选择元素

时间:2020-07-02 13:44:30

标签: python-3.x list list-comprehension

我发现下面的代码有些混乱。

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个列表,而我们却得到前两个元素...

我对列表理解没有太多经验,但是有人可以向我详细解释一下这一部分...

谢谢!

2 个答案:

答案 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')]
相关问题