在列表中连接后获取最大数量

时间:2015-06-24 08:17:37

标签: python

给出了整数列表。我们需要对此列表进行排序以在连接后获得最大数量。

例如,我们有

[4, 94, 9, 14, 1]

必须按照

进行排序
[9, 94, 4, 14, 1]

并提供号码9944141

3 个答案:

答案 0 :(得分:2)

任何自定义排序归结为实现比较器,它可以告诉你哪些元素在哪些元素之前。

在您的情况下,您应该尝试一些简单的示例来查看比较应该如何工作。让a <~ b表示“a应该在b之前排序”。一些例子:

9 <~ 94
89 <~ 8 (why?)
14 <~ 1
5 <~ 4

基于这些示例,您应该编写一个函数

def compare(a, b):
    # return -1 if a < b according to the rule above, 0 if they are equal and 1 otherwise

然后你可以简单地调用Python的sort函数:

numlist.sort(cmp=compare)

(由于没有给出代码,问题听起来像是一个练习,我的答案集中在提供提示而不是完整的解决方案!)

答案 1 :(得分:2)

举个例子,由于O(n!)复杂性,这种方法不能很好地扩展:

>>> import itertools
>>> l = [4, 94, 9, 14, 1]
>>> print list(max((int("".join(p)), p) for p in itertools.permutations(str(x) for x in l))[1])
['9', '94', '4', '14', '1']

找到所有排列,将单个项目转换为字符串并连接,结果将转换为整数。选择具有最高整数值的置换。

更新:

如果有人对更好的表现感兴趣:

def compare(x, y):
    sx = str(x)
    sy = str(y)
    sxy = sx + sy
    syx = sy + sx
    if sxy < syx:
        return -1
    elif sxy > syx:
        return +1
    return 0

print sorted(l, cmp=compare, reverse=True)
# It gives [9, 94, 4, 14, 1]

答案 2 :(得分:2)

最简单但效率不高的方法是:

import itertools

nums = [4, 94, 9, 14, 1]
max_num = 0
max_nums = None
for p in itertools.permutations(map(str, nums)):
    num = int(''.join(p))
    if num > max_num:
        max_num = num
        max_nums = p
print map(int, max_nums)
print max_num

输出:

[9, 94, 4, 14, 1]
9944141