我已经开始研究一些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]
或类似。那里有哪些Pythonist可以提供帮助? :)
答案 0 :(得分:7)
c = range(a, b)
print [d * e for d in c for e in c]
答案 1 :(得分:3)
from itertools import product
def palindrome(i):
return str(i) == str(i)[::-1]
x = xrange(900,1000)
max(a*b for (a,b) in (product(x,x)) if palindrome(a*b))
xrange(900,1000)
与range(900,1000)
类似,但不返回列表,而是返回一个对象,该对象根据需要生成范围内的数字。对于循环,这比range()和更高的内存效率稍快。
product(xrange(900,1000),xrange(900,1000))
给出了输入迭代的笛卡尔乘积。它等同于嵌套的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) ...
str(i)[::-1]
列出了速记以反转列表。
请注意所有内容都包含在generator expression中,这是一种高性能,内存效率高的列表推导和生成器概括。
另请注意,由两个2位数字的乘积制成的最大回文数字由数字91 99,range(90,100)
中的两个数字组成。外推到3位数字,您可以使用range(900,1000)
。
答案 2 :(得分:2)
我认为你会喜欢这种单行(格式化的可读性):
max(z for z in (d*e
for d in xrange(100, 1000)
for e in xrange(100, 1000))
if str(z) == str(z)[::-1])
或略有改变:
c = range(100, 1000)
max(z for z in (d*e for d in c for e in c) if str(z) == str(z)[::-1])
想知道Lisp中有多少个parens ......