Python 省略列表理解中的元素

Python 省略列表理解中的元素,python,list-comprehension,Python,List Comprehension,有以下简单脚本: def MyFunction(digit): if digit < 4: return digit else: return None A = [1, 2, 3, 4, 5] B = [MyFunction(x) for x in A] print(B) # [1, 2, 3, None, None] def MyFunction(数字): 如果数字

有以下简单脚本:

def MyFunction(digit):
    if digit < 4:
        return digit
    else:
        return None

A = [1, 2, 3, 4, 5]
B = [MyFunction(x) for x in A]
print(B) # [1, 2, 3, None, None]
def MyFunction(数字):
如果数字<4:
返回数字
其他:
一无所获
A=[1,2,3,4,5]
B=[A中x的MyFunction(x)]
打印(B)#[1、2、3、无、无]
问题:


是否可以以某种方式重写
MyFunction()
,使
B
在不使用
None
的情况下等于
[1,2,3]
?请不要建议我在列表理解中使用
if
表达式,在列表理解后处理
B
,等等。

要过滤元素,您需要使用
filter()
或带有
if
的列表理解

即:

B=过滤器(λ位数:位数<4,A)
您可以使用函数,但它应返回布尔值:

def MyFunction(digit):
    if digit < 4:
        return True
    else:
        return False
B = filter(MyFunction, A)
def MyFunction(数字):
如果数字<4:
返回真值
其他:
返回错误
B=过滤器(MyFunction,A)
或者简单地说:

def MyFunction(digit):
    return digit < 4
def MyFunction(数字):
返回数字<4
具有列表理解能力:

B = [digit for digit in A if digit < 4]
B=[如果数字<4,则A中的数字对应数字]
是否有可能以某种方式重写MyFunction(),使B等于[1,2,3],而不使用None?请不要建议我在列表理解中使用if表达式,在列表理解后使用进程B等等

不,不是。您对列表的理解不会改变列表的长度。在
MyFunction()
中,您无法进行任何更改。您必须在列表理解中使用
if
,或者对列表进行某种预处理或后处理

如中所述:

理解包括一个表达式,后跟至少一个for子句和零个或多个for或if子句。在这种情况下,新容器的元素是通过将for或if子句中的每一个视为块,从左到右嵌套,并在每次到达最里面的块时计算表达式以生成元素来生成的元素


对于迭代,每个
得到一个元素。这是内置在语言中的。

从函数中调整迭代器是可能的,但非常难看。不幸的是,我无法摆脱最后一个
,但也许其他人可以接受这个想法并加以改进。这是我的努力,我扩展了测试数据:

import sys

def MyFunction(digit):
    if digit < 4:
        return digit
    else:
        while digit >= 4:
            try:
                digit = sys._getframe(1).f_locals['.0'].__next__()
            except StopIteration:
                break
        else:
            return digit

A = [6, 7, 1, 2, 3, 4, 5]
B = [MyFunction(x) for x in A]
print(B)

我完全希望有人会说这种做法非常危险,而且是针对具体实施的——我不会反驳这种评论。

我对这些琐碎的操作没有问题。在我的问题中,我特别问了关于修改MyFunction()的问题Kevin,谢谢你的回答。您能提供一些参考吗?在MyFunction()中,您无法改变这一点:不完全正确,请参阅下面我的hack。如果你说“你不应该做任何改变”,我会同意的。@cdarke:我不确定这在PyPy下是否有效;对我来说,这显然是不标准和不可移植的。@凯文:没有争论!OP使用PyPy吗?@cdarke:OP说的是“Python”而不是“CPython”;我会把它理解为标准的便携设备。
import sys

def MyFunction(digit):
    if digit < 4:
        return digit
    else:
        while digit >= 4:
            try:
                digit = sys._getframe(1).f_locals['.0'].__next__()
            except StopIteration:
                break
        else:
            return digit

A = [6, 7, 1, 2, 3, 4, 5]
B = [MyFunction(x) for x in A]
print(B)
[1, 2, 3, None]