5

我正在尝试制作更短、更pythonic、可读的python。对于Project Euler 的问题 8,我有这个可行的解决方案(在 1000 位数字中找到 5 个连续数字的最大乘积)。

关于编写这个脚本的更 Pythonic 版本的建议?

numstring = ''
for line in open('8.txt'):
    numstring += line.rstrip()

nums = [int(x) for x in numstring]

best=0
for i in range(len(nums)-4):
    subset = nums[i:i+5]
    product=1
    for x in subset:
        product *= x
    if product>best:
        best=product
        bestsubset=subset

print best
print bestsubset

例如:下面的代码段必须有一个单行。我确定这里有一个过去的话题,但我不确定如何描述我在下面做的事情。

numstring = ''
for line in open('8.txt'):
    numstring += line.rstrip()

有什么建议么?多谢你们!

4

5 回答 5

4
from operator import mul

def product(nums):
    return reduce(mul, nums)

nums = [int(c) for c in open('8.txt').read() if c.isdigit()]
result = max((product(nums[i:i+5]) for i in range(len(nums))))
于 2012-07-27T18:06:53.253 回答
4

我正在研究一个完整的答案,但现在这是一个班轮

numstring = ''.join(x.rstrip() for x in open('8.txt'))

编辑:给你!一个用于搜索的班轮。列表推导很棒。

from operator import mul
def prod(list):
    return reduce(mul, list)

numstring = ''.join(x.rstrip() for x in open('8.txt'))
nums = [int(x) for x in numstring]
print max(prod(nums[i:i+5]) for i in range(len(nums)-4))
于 2012-07-27T18:04:12.850 回答
1

这是我的解决方案。我尝试编写我知道如何编写的最“Pythonic”的代码。

with open('8.txt') as f:
    numstring = f.read().replace('\n', '')

nums = [int(x) for x in numstring]

def sub_lists(lst, length):
    for i in range(len(lst) - (length - 1)):
        yield lst[i:i+length]

def prod(lst):
    p = 1
    for x in lst:
        p *= x
    return p

best = max(prod(lst) for lst in sub_lists(nums, 5))
print(best)

可以说,这是使用的理想案例之一,reduce因此可能prod()应该是:

# from functools import reduce   # uncomment this line for Python 3.x
from operator import mul
def prod(lst):
    return reduce(mul, lst, 1)

我不喜欢尝试在有理由多行的情况下编写单行。我真的很喜欢这个with声明,而且我的习惯是将它用于所有 I/O。对于这个小问题,你可以只做单行,如果你使用 PyPy 或其他东西,当你的小程序完成执行并退出时,文件将被关闭。但我喜欢使用双线,with所以我写了那个。

我喜欢@Steven Rumbalski 的单线:

nums = [int(c) for c in open('8.txt').read() if c.isdigit()]

我可能会这样写:

with open("8.txt") as f:
    nums = [int(ch) for ch in f.read() if ch.isdigit()]

同样,对于这种短程序,您的文件将在程序退出时关闭,因此您不必担心确保文件被关闭;但我喜欢养成使用with.

于 2012-07-27T19:04:15.760 回答
0

至于解释最后一点是什么,首先你创建一个string名为的空numstring

numstring = ''

然后循环遍历文件中的每一行文本(或strings 行):txt8.txt

for line in open('8.txt'):

因此,对于您找到的每一行,您都希望将结果添加line.rstrip()到其中。rstrip从字符串中“去除”空格(换行符、空格等):

    numstring += line.rstrip()

假设您有一个8.txt包含文本的文件:LineOne \nLyneDeux\t\nLionTree您最终会得到一个看起来像这样的结果:

>>>'LineOne' #loop first time
>>>'LineOneLyneDeux' # second time around the bush
>>>'LineOneLyneDeuxLionTree' #final answer, reggie
于 2012-07-27T18:02:30.357 回答
0

这是一个完整的解决方案!首先读出数字:

with open("8.txt") as infile:
    number = infile.replace("\n", "")

然后创建一个包含 5 个连续数字的列表:

cons_numbers = [list(map(int, number[i:i+5])) for i in range(len(number) - 4)]

然后找到最大的并打印出来:

print(max(reduce(operator.mul, nums) for nums in cons_numbers))

如果您使用的是 Python 3.x,则需要替换reducefunctools.reduce.

于 2012-07-27T18:02:51.730 回答