python程序调试相邻数字的产品

时间:2016-07-26 11:28:11

标签: python debugging numpy

我目前正在研究项目欧拉问题8,该问题要求在1000位长数中找到13个相邻数字的最大乘积。我导入了numpy prod函数来计算产品。它似乎没有while循环,但使用while循环它会发出一个奇怪的错误消息。有人可以解释一下我的错误吗?

代码:

from numpy import prod

z=\
73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
242190226710556263211111093705442175069416589604080
7198403850962455444362981230987879927244284909188
845801561660979191338754992005240636899125607176060
5886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450

b=[int(i) for i in str(z)]
x=0
i=0

while i <=1000-13:

   if prod(b[i:i+13])>x:
        x=prod(b[i:i+13])
   else:
        pass

print(x)

这是我的错误输出:

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/numpy/core/fromnumeric.py", line 2336, in prod
prod = a.prod
AttributeError: 'list' object has no attribute 'prod'

1 个答案:

答案 0 :(得分:1)

您可以首先通过列表理解和内置函数z将多行字符串int()转换为数字列表:

z = """73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
242190226710556263211111093705442175069416589604080
7198403850962455444362981230987879927244284909188
845801561660979191338754992005240636899125607176060
5886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450"""

digits = [int(num) for num in z.replace('\n', '')]

请注意,通过调用z.replace('\n', '')已从原始字符串中删除换行符。

然后你可以使用函数operator.mul()在一行代码中完成工作:

from operator import mul
x = max(reduce(mul, digits[i:i+13]) for i in range(len(digits) - 12))

Python 3用户需要添加句子from functools import reduce,因为最新版本的语言reduce()不再是内置函数。

演示:

In [304]: digits
Out[304]: 
[7, 
 3, 
 1,
 6,
 ...
 3,
 4,
 5,
 0]

In [305]: x
Out[305]: 23514624000L