Две последовательные сортировки с разными критериями - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь сделать сортировщик, который сортирует номер списка int.

Когда приведен список, сначала он изменяет его на двоичный и проверяет, сколько там 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

1 Ответ

0 голосов
/ 18 мая 2018

Вот решение в одну строку:

sorted_nums = sorted(nums, key=lambda x: (bin(x).count('1'), x))

Ваша реализация выглядит нормально, хотя она очень неэффективна.Скорее всего, проблема в строке

nums = list(set(nums))

. При этом удаляются все дублирующиеся элементы в списке, что противоречит духу проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...