我已经开始研究一些Project Euler问题,并用一个简单的暴力解决方案解决了number 4:
def mprods(a,b):
c = range(a,b)
f = []
for d in c:
for e in c:
f.append(d*e)
return f
max([z for z in mprods(100,1000) if str(z)==(''.join([str(z)[-i] for i in range(1,len(str(z))+1)]))])
解决后,我试图使它尽可能紧凑,并提出了可怕的底线!在
不想半途而废,我试图将mprods
函数压缩成一个列表理解。到目前为止,我提出了以下几点尝试:
[d*e for d,e in (range(a,b), range(a,b))]
[d*e for x in [e for e in range(1,5)] for d in range(1,5)]
[4, 8, 12, 16, 4, 8, 12, 16, 4, 8, 12, 16, 4, 8, 12, 16]
,我所期望的
[1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16]
或类似的。在有什么Python爱好者能帮上忙吗?:)
我想你会喜欢这一行(为了可读而格式化):
或稍有变化:
^{pr2}$不知道在Lisp中有多少paren。。。在
xrange(900,1000)
与range(900,1000)
相似,但它不是返回列表,而是返回一个按需生成范围内数字的对象。对于循环,这比range()稍快,并且更节省内存。product(xrange(900,1000),xrange(900,1000))
给出输入iterables的笛卡尔积。它相当于嵌套for循环。例如,product(A, B)
返回的结果与:((x,y) for x in A for y in B)
相同。最左边的迭代器在最外层的for循环中,因此输出元组以类似于里程表的方式循环(每次迭代时最右边的元素都会改变)。在product('ab', range(3))
>;('a',0) ('a',1) ('a',2) ('b',0) ('b',1) ('b',2)
product((0,1), (0,1), (0,1))
>;(0,0,0) (0,0,1) (0,1,0) (0,1,1) (1,0,0) ...
{cd10>是列表的速记。
请注意,所有内容都是如何包装在generator expression中的,这是一种高性能、节省内存的列表理解和生成器的泛化。
还要注意,由两个2位数的乘积构成的最大回文是由数字9199构成的,
range(90,100)
中的两个数字。外推到3位数字可以使用range(900,1000)
。相关问题 更多 >
编程相关推荐