2

セットから整数を並べ替えて連結することにより、最大の整数を生成する方法の問題の解決策を書いていました。最大整数の場合、整数として表現されたときのセットからの隣接する整数の任意の 2 つの配置は、スワップされるそれらの配置よりも大きいことがわかりました。すなわち、与えられた {98, 9}; 配置 998 は 989 より大きい。これは、以下に示す例のすべての構成整数に適用されます。

Python 2.7 と 3.3 で動作するコードを作成する必要があり、次の Python コードを思いつきました。

try:
    cmp     # Python 2 OK or NameError in Python 3
    def maxnum(x):
        return ''.join(sorted((str(n) for n in x),
                              cmp=lambda x,y:cmp(int(y+x), int(x+y))))
except NameError:
    # Python 3
    from functools import cmp_to_key
    def cmp(x, y):
        return -1 if x<y else ( 0 if x==y else 1)
    def maxnum(x):
        return ''.join(sorted((str(n) for n in x),
                              key=cmp_to_key(lambda x,y:cmp(int(y+x), int(x+y)))))

for numbers in [(1, 34, 3, 98, 9, 76, 45, 4), (54, 546, 548, 60)]:
    print('Numbers: %r\n  Largest integer: %15s' % (numbers, maxnum(numbers)))

これにより、次の出力が得られます。

Numbers: (1, 34, 3, 98, 9, 76, 45, 4)
  Largest integer:    998764543431
Numbers: (54, 546, 548, 60)
  Largest integer:      6054854654

現在、Raymond Hettinger は、'key=' は 'cmp=' よりも優れていると述べており、私は彼に同意する傾向があります (Pycon 2013 の講演「Transforming code into Beautiful, Idiomatic Python」の前)。私の問題は、 cmp function のようにエレガントなキー関数で問題を解決できなかったことです。

何か案は?ありがとう。

4

1 に答える 1

0

それを行うための非常に簡単な方法(または原則と言うべきです)があります:数値の仮数を比較するだけです。

1 -> 1.0
34 -> 3.4
548 -> 5.48

など…</p>

どうやってそれを手に入れることができますか?さて、数値の長さを取得し、数値length = log10(number)//1を で割る必要があり10**lengthます。

from math import log10
def mantissa(number):
    return number / 10**( log10(number)//1 )

これで、仮数をキー関数として使用できます。

>>> sorted((1, 34, 3, 98, 9, 76, 45, 4), key = mantissa )
[1, 3, 34, 4, 45, 76, 9, 98]

したがって、 -result を逆にするsorted必要があり、これであなたと同じように使用できます。

>>> for numbers in [(1, 34, 3, 98, 9, 76, 45, 4), (54, 546, 548, 60)]:
...     print 'Numbers: %r\n  Largest integer: %15s' % (
                numbers,
                ''.join(str(i) for i in sorted(numbers, key = mantissa, reverse = True))
               )
... 
Numbers: (1, 34, 3, 98, 9, 76, 45, 4)
  Largest integer:    989764543431
Numbers: (54, 546, 548, 60)
  Largest integer:      6054854654
于 2013-11-25T21:58:54.930 に答える