セットから整数を並べ替えて連結することにより、最大の整数を生成する方法の問題の解決策を書いていました。最大整数の場合、整数として表現されたときのセットからの隣接する整数の任意の 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 のようにエレガントなキー関数で問題を解決できなかったことです。
何か案は?ありがとう。