通过排列各个数字获得最大值

时间:2019-07-02 17:03:47

标签: python python-3.x sorting

我试图编写一个函数maximum_number(),该函数可以通过排列给定数字列表的顺序来输出最大值(例如21,2应该为221。543,5432,1应该为54354321)。我已经使用很多案例测试过这是一个家庭作业问题,但没有得到任何错误答案。但是,评分系统一直告诉我我的输出错误(没有在其末尾显示输出)。我怀疑在某些特殊情况下,有一小段代码会导致错误的输出,但我找不到。

    #Uses python3
    #%%

    import functools


    def greater(str1, str2):

        if str1==str2:
            return 1 


        for i in range(min(len(str1),len(str2))):

            if str1[i]>str2[i]:
                return 1

            if str1[i]<str2[i]:
                return -1


        if len(str1)>len(str2):
            if str1[len(str1)-len(str2)-1]>str1[0]:
                return 1
            else:
                return -1

        if len(str1)<len(str2):
            if str2[len(str2)-len(str1)-1]>str2[0]:
                return -1
            else:
                return 1

    def largest_number(a):

        a=list(map(str,a))
        a_sorted=sorted(a,key=functools.cmp_to_key(greater),reverse=True)
        largest=int(''.join(a_sorted))
        return(largest)


    #test cases:
    largest_number([21,2])
    largest_number([543,5432,1])

2 个答案:

答案 0 :(得分:0)

您可以使用Itertools模块解决该问题:

import itertools
import functools

#"my_list" object is a list of string objects.
def largest_number(my_list):
    answer = 0
    for i in itertools.permutations(my_list):
        x = int(functools.reduce(lambda x,y:x+y,i))
        if x > answer: 
            answer = x
    return answer

此代码之所以有效,是因为itertools模块的“排列”方法返回列表组合的所有可能情况。

答案 1 :(得分:0)

greater中的逻辑在处理一个字符串是另一个字符串的左子字符串的情况时并不完全正确:

    if len(str1)>len(str2):
        if str1[len(str1)-len(str2)-1]>str1[0]:
            return 1
        else:
            return -1

在这里,您无法正确处理str1[len(str1)-len(str2)-1]等于str1[0]的情况。在那种情况下,您应该进一步迭代,增加两个字符串的索引(就像您在算法的第一部分所做的那样)。因此,将上面的代码更改为:

    if len(str1)>len(str2):
        for i in range(len(str2),len(str1)):
            if str1[i]>str1[i-len(str2)]:
                return 1
            if str1[i]<str1[i-len(str2)]:
                return -1

...并对镜像案例进行类似的更改。

但是,有一种更简单的方法可以解决此问题。在greater函数中,您可以通过两种可能的方式将两个字符串连接起来,然后进行比较以查看这两个字符串中哪个更大:

def cmp(a, b): # This function was included in Python 2.x, but no longer in 3.x
    return (a > b) - (a < b)

def greater(str1, str2):
    return cmp(str1 + str2, str2 + str1)