Как отсортировать список из N элементов, а затем заменить отсутствующие значения от 0 до N на -1 - PullRequest
0 голосов
/ 07 октября 2018

Пример теста

                     Input                                  Output

 - Test Case 1       3 1 4 2 5 0                            0 1 2 3 4 5
 - Test Case 2       4 7 -1 9 -1 5 3 -1 -1 -1           -1 -1 -1 3 4 5 -1 7 -1 9

вы можете видеть, что пропущенные числа заменяются на -1 в том месте, где они пропущены (то есть в отсортированном виде). ​​Как мне добиться этого результата, я могучтобы получить ввод по

num = list(set((map(int, input().split()))))
num.sort()

Ответы [ 5 ]

0 голосов
/ 07 октября 2018

Чистый метод Python будет включать в себя понимание списка, range и set.Если вы заинтересованы в производительности для больших массивов, я предлагаю использовать стороннюю библиотеку, такую ​​как NumPy:

import numpy as np

a = np.array([3, 1, 4, 2, 5, 0])
b = np.array([4, 7, -1, 9, -1, 5, 3, -1, -1, -1])

def reindexer(x):
    res = np.arange(len(x) + 1)
    res[~np.isin(res, x)] = -1
    return res

reindexer(a)  # array([0, 1, 2, 3, 4, 5])
reindexer(b)  # array([-1, -1, -1,  3,  4,  5, -1,  7, -1,  9])
0 голосов
/ 07 октября 2018

Вот как бы я это сделал (если я правильно понимаю ваш вопрос)

test1 = [3, 1, 4, 2, 5, 0]
test2 = [4, 7, -1, 9, -1, 5, 3, -1, -1, -1]

print([i if i in test1 else -1 for i in range(0, len(test1))])
print([i if i in test2 else -1 for i in range(0, len(test2))])

>>>[0, 1, 2, 3, 4, 5]
>>>[-1, -1, -1, 3, 4, 5, -1, 7, -1, 9]
0 голосов
/ 07 октября 2018
def sort(list):
    length = len(list) - 1
    unsorted = True

    while unsorted:
        for element in range(0,length):
            unsorted = False
            if list[element] > list[element + 1]:
                hold = list[element + 1]
                list[element + 1] = badList[element]
                list[element] = hold
            else:
                unsorted = True
    i = 0
    while i < range(len(list)-1):
        if list[i+1] - list[i] != 1 and list[i+1] != -1 and list[i] != -1:
            list.insert(i+1, -1)
            i = i - 1
        i = i - 1
    return list
list = [3,1,4,2,5,0]
print(sort(list))

Это то, что вы ищете?

0 голосов
/ 07 октября 2018

Понимание списка Python - довольно простая концепция.Вы можете перебирать список и извлекать элементы списка в зависимости от ваших условий.

Рассмотрите следующий пример:

old_list = [1, 2, 3, 4, 5]
new_list = []
for elem in old_list:
    new_list.append(elem)
print(new_list)  # [1, 2, 3, 4, 5]

Код в основном создает список из другого.Здесь нет ничего особенного.Но это не pythonic способ сделать это.Давайте сделаем это pythonic способом:

old_list = [1, 2, 3, 4, 5]
new_list = [elem for elem in old_list]

Это точно так же.Но почему мы просто не скопировали old_list в new_list напрямую?Потому что понимание списка можно использовать не только для копирования элементов как есть.Смотрите это:

old_list = [1, 2, 3, 4, 5]
new_list = [elem+1 for elem in old_list]
print(new_list)  # [2, 3, 4, 5, 6]

Теперь вы создали другой список!Вы можете выполнить любую операцию над элементами списка, чтобы создать новый.

Поскольку в python также есть троичная операция, это можно сделать также:

a = 3 if x>2 else 4

Это сокращение для этого кода:

if x>2:
    a = 3
else:
    a = 4

Когда вы объединяете понимание списка и троичные операции, вы можете решить свою проблему всего за 1 строку кода.

a = [1, 2 ,3 ,4 ,5]
def zerofy(arr, n):
    return [-1 if 0<=elem<=n else elem for elem in arr]

zerofy(a, 2)
# [-1, -1, 3, 4, 5]
0 голосов
/ 07 октября 2018

Вы можете сохранить числа из списка ввода в наборе .Затем, чтобы получить список вывода, вы можете перебрать диапазон чисел и проверить, есть ли они в наборе:

in_list = [4, 7, -1, 9, -1, 5, 3, -1, -1, -1]    
s = set(in_list)
out_list = [i if i in s else -1 for i in range(len(in_list))]    
print(out_list)  # [-1, -1, -1, 3, 4, 5, -1, 7, -1, 9]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...