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 演讲“将代码转换为漂亮的惯用 Python”之前)。我的问题是我无法使用像 cmp 函数这样优雅的关键函数来解决问题

有任何想法吗?谢谢。

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]

所以我们只需要反转sorted-result,现在我们可以像你一样使用它:

>>> 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 回答