0

I'm trying to print the product of all elements of an array with len(array) - 1. e.g. array = ['1','10','11']; so 10*11 since 10 and 11 have a length = 2.

I've written the following code but can't seem to find the issue (I keep receiving a 'None').

import numpy
def fun(array):
    length = len(array) - 1; " find length of the array "
    for i in range(0,length+1):
        if len(array[i]) == length: 
            """find elements in array with len == length"""
            new_array = []
            new_array.append(array[i])
            "add these elements into a new array"
            for j in range(0,len(new_array)):
                return numpy.prod(int(new_array[j]))
                "find the product of these elements and return them"
            else: break
        else: break 

Any help will be appreciated.

4

4 回答 4

2

首先,您的代码似乎不是很pythonic,对于循环不要那样使用范围,'''它们用于文档字符串,而#用于注释,并且您可以在需要时使用break continue

在您的代码中,如果第一个元素的长度不正确,则代码永远不会返回。它会返回错误的值。

一个简单的使用解决方案numpy是(除了@hcwhsa using 之一mul):

import numpy
def fun(array):
    length = len(array) - 1;  # find length of the array
    return numpy.prod([int(x) for x in array if len(x) == length])
于 2013-11-12T18:08:37.490 回答
2

你的代码有很多问题:

  1. new_array = []每次都在循环内重新定义,因此之前附加的项目会丢失。

  2. 您应该附加整数而不是简单的字符串。

  3. numpy.prod可以应用于整个数组,不需要第二个循环。

  4. 内部循环没有正确缩进。

  5. 虽然这没有错,但在 python 中,您可以迭代数组/列表本身的项目,而不是使用索引。

工作版本:

import numpy
def fun(array):
    length = len(array) - 1; " find length of the array "
    new_array = []
    #iterate over the list itself.
    for item in array:
        if len(item) == length: 
            new_array.append(int(item))
    return numpy.prod(new_array)

print fun(['1','10','11'])    

纯python版本:

>>> from operator import mul
>>> arr =  ['1','10','11']
>>> reduce(mul, (int(x) for x in arr if len(x) == len(arr)-1))
110
于 2013-11-12T18:02:52.987 回答
2

您的第一个问题是,在 python 中,没有显式返回的函数返回 None。您的代码中有一个 return,但是您得到 None 因为代码路径没有到达 return 语句(有关此内容的更多信息,请参见下一个问题)。例如,以下bad_abs函数将返回 None if a > 0。您可以通过确保每个代码路径都有一个 return 语句来解决此问题:

def bad_abs(a):
    if a < 0:
        return -a

def good_abs(a):
    if a < 0:
        a = -a
    return a

其次,在 if 语句的 else 子句和内部 for 循环的 else 子句中有一个 break 语句。这是一个如何正确使用 break 语句的示例。

def any(array):
    return_value = False
    for item in array:
        if item == True:
            return_value = True
            break # Exit the loop and go to return
    return return_value

在您的代码中,您不希望中断,实际上在数组中的第一个非长度项之后中断会导致您的代码到达函数的末尾并返回 None。看起来你不需要 else 子句,所以把它们拿出来。

最后,您正在创建一个空列表,即[],在循环的每次迭代中,这将删除您在之前的迭代中找到的值。因此,您要确保在循环之外创建 new_array (并请给它一个更好的名称)。

def filter_product(array):
    filtered_array = []
    length = len(array) - 1
    for item in array:
        if len(item) == length:
            filtered_array.append(int(item))
    return numpy.prod(filtered_array)

这可以简化为 1 行列表理解,但我发现一个行列对于学习编程并不是特别有用。

于 2013-11-12T18:02:58.127 回答
0
numbers = ['1','10','11']
product = 1
for n in numbers:
    if len(n) == 2:
        product *= int(n)
print product
于 2013-11-12T19:56:21.003 回答