3

私はいくつかのプロジェクトオイラーの問題に取り組み始め、単純なブルートフォースソリューションで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]か、または同様のものを与えます。

役立つPythonistasはありますか?:)

4

3 に答える 3

7
c = range(a, b)
print [d * e for d in c for e in c]
于 2010-02-24T20:21:17.410 に答える
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]リストを逆にするためのリストスライスの省略形です。

  • すべてが ジェネレータ式、リスト内包表記とジェネレータの高性能でメモリ効率の高い一般化にどのようにラップされているかに注意してください。

  • また、2つの2桁の数字の積から作成される最大の回文は、番号91 99、の2つの数字から作成されることに注意してくださいrange(90,100)。使用できる3桁の数値に外挿しますrange(900,1000)

于 2010-02-25T13:51:02.750 に答える
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があるのだろうか...

于 2010-02-24T20:28:54.770 に答える