Сортировка списка кроме нуля в python - PullRequest
2 голосов
/ 29 апреля 2020

у меня есть список [5,3,0,0,4,1,4,0,7], и я хочу каким-то образом отсортировать список, чтобы нули оставались на своих местах, а другие были отсортированы, ответ такой: [1,3,0,0,4,4,5,0,7]

Я написал этот код, но не могу зафиксируйте нули на их месте

def except_zero(items: list) -> Iterable: 
    ans=[] 
    for i in range(len(items)): 
        if (items[i] != 0): 
            ans.append(items[i]) 
            ans = sorted(ans) 

    j = 0 
    for i in range(len(items)): 
        if (items[i] >= 0): 
            items[i] = ans[j] 
            j += 1 
            return ans

Ответы [ 6 ]

2 голосов
/ 29 апреля 2020

Более эффективный подход, который решает проблему в O (n) сложности времени, заключается в сохранении индексов нулей в наборе, сортировке остальных элементов, а затем итерации индекса по длине из списка ввода для вывода нулей, если индекс находится в наборе, или следующий элемент в отсортированном списке, если нет:

def except_zero(items):
    zeroes = {i for i, v in enumerate(items) if v == 0}
    others = iter(sorted(v for v in items if v != 0))
    return [0 if i in zeroes else next(others) for i in range(len(items))]

, так что:

except_zero([5,3,0,0,4,1,4,0,7])

возвращает:

[1, 3, 0, 0, 4, 4, 5, 0, 7]
2 голосов
/ 29 апреля 2020

Я бы сделал:

orig_list = [5,3,0,0,4,1,4,0,7]
result = sorted([i for i in orig_list if i!=0])
for inx, elem in enumerate(orig_list):
    if elem == 0:
        result.insert(inx, 0)
print(result)  # [1,3,0,0,4,4,5,0,7]

Сначала я сортирую ненулевые значения, затем вставляю ноль в список result в тех местах, где он появляется в orig_list.

2 голосов
/ 29 апреля 2020

Вы можете попробовать это:

def sort_and_extract_non_zero_items(items: list) -> Iterable:
  return sorted([n for n in l if n != 0])

def replace_non_zero_items(original: list, non_zeroes: list) -> Iterable:
  return [non_zeroes.pop(0) if n != 0 else 0 for n in original]

non_zero_list = sort_and_extract_non_zero_items(items)

items = replace_non_zero_items(items, non_zero_list)
0 голосов
/ 29 апреля 2020

Сначала необходимо сохранить позицию индекса с нулевыми значениями:

zero_positions = [i for i, this in enum(mylist) if this == 0]

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

ordered = [this for this in mylist if this != 0].sorted()

и, наконец, вы можете вставить нули в правильные позиции:

for i in zero_positions:
    ordered.insert(i, 0)

Вот и все. Может быть, есть более быстрый путь, это первое, что пришло мне в голову.

Надежда, которая помогает Франческо

0 голосов
/ 29 апреля 2020
def except_zero(items: list) -> Iterable: 
    ans=[]
    ind=[]
    for i in range(len(items)): 
        if (items[i] != 0): 
            ans.append(items[i]) 
            ind.append(i)

    ans = list(sorted(ans))
    for i in range(len(ind)): 
            items[ind[i]] = ans[i] 
    return items

Будет работать что-то подобное, вы просто сохраните позиции индекса с ненулевыми значениями, а затем поместите отсортированные значения в соответствующие позиции индекса

Даже ваш собственный подход может работать, если вы исправите пара вопросов, например:

def except_zero(items: list) -> Iterable: 
    # get and sort non zero values
    non_zero = list(sorted([x for x in items if x!=0]))
    j = 0 
    # place them in correct position
    for i in range(len(items)): 
        if (items[i] != 0): 
            items[i] = non_zero[j]  # get next sorted non_zero value for this position
            j += 1 # update index

    return items
0 голосов
/ 29 апреля 2020

Не элегантно, но, кажется, работает:

l_in = [5,3,0,0,4,1,4,0,7]
l_out = []

# grab and sort all your non-zero values
nonz = sorted([x for x in l_in if x!=0])

# build your new list, adding a zero if there was one in that
# position, else poppping off the first item in the sorted
# non-zero list
for i in range(len(l_in)):
    l_out.append(0 if l_in[i]==0 else nonz.pop(0))

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