python是否有这个简单任务的简写?

xzh*_*zhu 7 python

我刚刚开始学习长期听到的python语言.我之前一直在和C合作.我发现python,因为现代脚本语言在各种任务上都非常简洁.

所以我想知道,如果我有一个列表foo = [1, 2, 3, 4, 5],我想从中挑出所有奇数bar.在C中,我可能会使用循环并检查每个数字foo并复制所需的元素bar.你们这些"蟒蛇式"的做法是什么?

mgi*_*nbr 20

bar = [x for x in foo if x % 2 == 1]
Run Code Online (Sandbox Code Playgroud)

这种形式称为"列表理解".在其基本形式中,它有4个部分:

  1. 您想要包含在输出列表中的内容.可以是涉及第二部分(下面)中定义的变量的任何表达式.在这种情况下,元素x,未经修改;

  2. 表示输入列表元素的变量或表达式.继关键字,列表中的每个元素将被绑定到该变量(如果你的列表中包含复杂的对象,你可以用解构赋值为仅指的特定部分).在这种情况下,列表的每个项目都绑定到x;

  3. 输入列表.在in关键字后面,您可以从中获取元素的列表(或其他可迭代的).在这种情况下,foo;

  4. 元素必须满足的条件才能包含在结果中(可选).如果包含,则添加关键字if后跟表达式,以确定该元素是否将包含在输出列表中.在这种情况下,如果数字是奇数.

  • `== 1`是不必要的. (2认同)
  • @nikow是的.就个人而言,我不喜欢依赖于0和非零的虚假/真实,更喜欢明确它.过去曾经因为与此相关的错误多次被咬过...(诚然,不是在Python中,而是在JavaScript中,它有更多糟糕的语义;但是伤痕仍然存在) (2认同)

Ese*_*gün 5

filter 功能是你正在寻找的:

bar = filter(lambda x: x % 2 == 1, foo)
Run Code Online (Sandbox Code Playgroud)

表达式lambda x: x % 2 == 1基本相当于

def isOdd(x):
    return x % 2 == 1
Run Code Online (Sandbox Code Playgroud)