完整的链条?未处理Python迭代

完整的链条?未处理Python迭代,python,python-2.7,while-loop,iteration,Python,Python 2.7,While Loop,Iteration,所以我写了一些代码,将整数从第零位堆叠到一个列表中。由于某种原因,我无法破译,下面的while循环没有被处理。我已经遵循了我所知道的所有好的样式和语法要求,while循环在自己运行时可以工作 def row(line): """ Function that merges a single row or column. """ result_length = len(line) print result_length # Create a list

所以我写了一些代码,将整数从第零位堆叠到一个列表中。由于某种原因,我无法破译,下面的while循环没有被处理。我已经遵循了我所知道的所有好的样式和语法要求,while循环在自己运行时可以工作

def row(line):
    """
    Function that merges a single row or column.
    """
    result_length = len(line)
    print result_length

    # Create a list of zeros the same length as the 'line' argument
    pts_alloc = 0
    dummy = 0
    result = line
    result[0:] = [pts_alloc for dummy in range(len(result))]
    print result

    #Iterate over the 'line' list looking for non-zero entries and 
    #stack them from 'result[0]'
    line_count = 0
    result_place = 0

    while (line_count <= (len(line)-1)):
        if (line[line_count] > 0):
            result[result_place] = line[line_count]
            print result
            result_place += 1
        line_count += 1

    return result
print row([4, 0, 0, 5])
def行(行):
"""
合并单个行或列的函数。
"""
结果长度=长度(直线)
打印结果长度
#创建一个与'line'参数长度相同的零列表
pts_alloc=0
虚拟=0
结果=行
结果[0:][pts_alloc用于范围内的假人(len(结果))]
打印结果
#迭代“行”列表,查找非零项,然后
#从“结果[0]”堆栈它们
行计数=0
结果_位置=0
而(第0行):
结果[结果位置]=行[行计数]
打印结果
结果_位置+=1
行计数+=1
返回结果
打印行([4,0,0,5])

这段代码中是否有我遗漏的重大错误?是否有一些我不知道的语法要求?

问题似乎在于这一部分:

result = line
result[0:] = [pts_alloc for dummy in range(len(result))]
通过用
result=line
替换
result
的一个片段,您也在替换
line
中的相同片段,因为
result
只是对相同列表的另一个引用,而不是副本

由于切片是整个列表,因此只需执行以下操作:

result = [pts_alloc for dummy in range(len(result))]
此外,您正在声明许多不必要的变量。您可以将代码缩短为:

def row(line):
    result = [0] * len(line)
    result_place = 0
    for x in line:
        if x > 0:
            result[result_place] = x
            result_place += 1
    return result
甚至这个:

def row(line):
    non_zero = [x for x in line if x > 0]               # take non-zero values
    return non_zero + [0] * (len(line) - len(non_zero)) # pad with zeros

问题似乎在于这一部分:

result = line
result[0:] = [pts_alloc for dummy in range(len(result))]
通过用
result=line
替换
result
的一个片段,您也在替换
line
中的相同片段,因为
result
只是对相同列表的另一个引用,而不是副本

由于切片是整个列表,因此只需执行以下操作:

result = [pts_alloc for dummy in range(len(result))]
此外,您正在声明许多不必要的变量。您可以将代码缩短为:

def row(line):
    result = [0] * len(line)
    result_place = 0
    for x in line:
        if x > 0:
            result[result_place] = x
            result_place += 1
    return result
甚至这个:

def row(line):
    non_zero = [x for x in line if x > 0]               # take non-zero values
    return non_zero + [0] * (len(line) - len(non_zero)) # pad with zeros

result=line;结果[0::=
在这里,您正在修改
!这是怎么回事?是否要将所有非零项移到前面?是否要写入
result=line[0:];结果=
结果=行;结果[0::=
在这里,您正在修改
!这是怎么回事?是否要将所有非零项移到前面?是否要写入
result=line[0:];结果=
?这是一个很好的例子,说明了为什么“直观”方法并不总是正确的方法。我知道在算法上移动零可能会更安全或者更迂腐,但是没有理由这样做。零是零,不证明什么,所以最好把它们扔掉,在末尾插入“新”的。这是一个很好的例子,说明为什么“直觉”方法并不总是正确的方法。我知道在算法上移动零可能会更安全或者更迂腐,但是没有理由这样做。零是零不证明什么,所以最好把它们扔掉,在末尾插入“新”的