Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 两个不同标准的连续排序_Python_Sorting - Fatal编程技术网

Python 两个不同标准的连续排序

Python 两个不同标准的连续排序,python,sorting,Python,Sorting,我正在尝试制作一个分拣机,对int列表中的数字进行排序 当列表给定时,它首先将其转换为二进制,并检查其中有多少个1,然后首先按升序排序 然后,它们在二进制中具有相同数量1的数字之间重新排序,如果一个大于另一个,则按升序重新排序 例如,对于给定的[1,2,3,4] 它返回[1,2,4,3] def Sort(nums): #to deprecated the duplicated nums nums = list(set(nums)) #input nums are lis

我正在尝试制作一个分拣机,对int列表中的数字进行排序

当列表给定时,它首先将其转换为二进制,并检查其中有多少个1,然后首先按升序排序

然后,它们在二进制中具有相同数量1的数字之间重新排序,如果一个大于另一个,则按升序重新排序

例如,对于给定的
[1,2,3,4]

它返回
[1,2,4,3]

def Sort(nums):
    #to deprecated the duplicated nums
    nums = list(set(nums))
    #input nums are list 

    search_list = [] #it contains (dec, bin, card)

    for i in range(len(nums)):

        binary = bin(nums[i])[2:] #it returns str of binary of given input
        count = 0

        for j in range(0, len(binary)):
            if binary[j] == str(1):
                count += 1
            else:
                pass 

        dec_bin_card = (nums[i], binary, count)

        search_list.append(dec_bin_card)

    sorted_draft = sorted(search_list, key = lambda x: x[2]) #sort by cardinality 

    for i in range(len(sorted_draft)-1):
        if sorted_draft[i][2] == sorted_draft[i+1][2]: #if has same count 
            if sorted_draft[i][0] > sorted_draft[i+1][0]:
                sorted_draft[i], sorted_draft[i+1] = sorted_draft[i+1], sorted_draft[i]
            else:
                pass

    sorted_final = [sorted_draft[i][0] for i in range(len(sorted_draft))]

    return sorted_final

以下是一个单线解决方案:

sorted_nums = sorted(nums, key=lambda x: (bin(x).count('1'), x))
您的实现看起来很好,尽管它效率很低。问题很可能就在这条线上

nums = list(set(nums))

这将删除列表中的任何重复元素,这似乎与问题的本质背道而驰。

您的结果似乎很好。1、2、4各有一个位,3有两个位。除非您仅显示所需的输出,而未能显示actual@I我也这么想。。但这是我的家庭作业,有一个测试用例来检查这个算法是否正确。但只有在数字1到31的组合中才能继续失败和成功。。。在这种情况下,如何检查错误?请尝试对数字32-64进行排序。这是一个足够小的范围,您可以手动检查。我认为您的问题是
nums=list(set(nums))
。您可以这样删除元素。sorted_nums=sorted(nums,key=lambda x:(bin(x).count(1),x))这会返回类似TypeError的错误:必须是str,而不是int@delinco1只需要用“1”来代替,它就可以工作了。@OlivierMelançon。谢谢你的帮助。该睡觉了:)