列表理解可以帮助缩短这段代码吗?

问题描述

我是一个完整的编码初学者,大约 3 周前开始使用 Python。我被邀请参加一个在线挑战(使用 python 2.7),我将其用作练习的机会。当前的挑战要求一个函数接受一个整数列表并返回这些数字的某个非空子集的最大乘积。

以下代码有效——即。它通过了挑战带来的考验——但我觉得它太长而且笨重。我无法评估它是快还是慢,但会假设后者。有没有人对一个很好的资源有建议,可以帮助我理解如何为未来的案例改进这种类型的代码? (例如,可以很好地解释列表理解的东西,也许?)

def solution(xs) :
    neglist = list()
    poslist = list()
    endlist = list()
    for number in xs :
        if number == 0 : continue
        if number < 0 : neglist.append(number)
        if number > 0 : poslist.append(number)
    neglist.sort()
    poslist.sort()
    if len(neglist) > 1 and len(neglist)% 2 != 0 :
        neglist = neglist[:-1]
    for number in neglist :
        endlist.append(number)
    for number in poslist :
        endlist.append(number)
    output = 1
    for number in endlist :
        output *= number
    if output < 0 and 0 in xs: output = 0
    return str(output)

解决方法

如果最后 5 行是正确的(从 output = 1 到末尾),那么您可以非常紧凑地替换为列表理解。

def split_pos_neg(original):
    original.sort()
    pos = [x for x in original if x > 0]
    neg = [x for x in original if x < 0]
    print (pos)
    print (neg)
    return

orig = [3,15,-2,-98,1]
split_pos_neg(orig) # prints [1,3,15] and [-98,-2]

代码 pos = [x for x in original if x > 0] 为原始列表的每个正元素创建一个名为 pos 的新列表。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...