Есть ли способ изменить список без возврата в функцию? (Функция сортировки) - PullRequest
0 голосов
/ 30 сентября 2019

В моем коде

реализована сортировка по пузырям, сортировка по вставке и быстрая сортировка, и первые два печатаются без каких-либо проблем при работе в качестве сети. Но последняя быстрая сортировка не отражает отсортированный список.

def Quick(item, reverse):

    if reverse:
        if len(item) <= 1:
            return item
        else:
            first = item[0]
            left = [i for i in item[1:] if i > first]
            right = [i for i in item[1:] if i <= first]
            return Quick(left, reverse) + [first] + Quick(right, reverse)
    else:
        if len(item) <= 1:
            return item
        else:
            first = item[0]
            left = [i for i in item[1:] if i <= first]
            right = [i for i in item[1:] if i > first]
            return Quick(left, reverse) + [first] + Quick(right, reverse)

def MySort(item, alg=None, reverse=False):

    if alg == 'Bubble':
        Bubble(item, reverse)

    elif alg == 'Insertion':
        Insertion(item, reverse)

    elif alg == 'Quick':
        item = Quick(item, reverse)

    if __name__ == "__main__":

    item1 = [1, 4, 3, 5, 6, 2, 8, 7, 9, 0]
    MySort(item1, alg='Bubble', reverse=True)
    print(item1)

    item2 = [5, 61, 89, 910, 123, 895, 2, 4, 77, 13, 5567, 83, 44]
    MySort(item2, alg='Insertion')
    print(item2)

    item3 = [5, 61, 89, 910, 123, 895, 2, 4, 77, 13, 5567, 83, 44]
    MySort(item3, alg='Quick', reverse=False)
    print(item3)

Конечно, если я использую 'return', чтобы получить выровненные значения в MySort() как,

    elif alg == 'Quick':
        item = Quick(item, reverse)
        return item

    item3 = MySort(item3, alg='Quick', reverse=False)

это разрешить. Но я хочу, чтобы список item3 изменился с использованием

MySort(item3, alg='Quick', reverse= False)

вместо

item3 = MySort(item3, alg='Quick', reverse=False)

Буду признателен за вашу помощь.

Ответы [ 3 ]

0 голосов
/ 30 сентября 2019

Пожалуйста, посмотрите этот поток stackoverflow

Ваше последующее предложение об использовании item3 = MySort(item3, alg='Quick', reverse=False) было бы правильным способом действий.

0 голосов
/ 30 сентября 2019

С этим типом рекурсивного алгоритма часто гораздо проще иметь дело, когда они являются чистыми функциями (=> без побочных эффектов). Простое простое решение: просто оберните рекурсивную реализацию в «фасадную» функцию, которая работает как положено: (примечание: код упрощен, чтобы избежать повторений)

import operator

# private implementation  
def _quick(item, reverse):
    if len(item) <= 1:
        return item


    if reverse:
        lcomp = operator.gt
        rcomp = operator.le
    else:
        lcomp = operator.le
        rcomp = operator.gt

    first = item[0]
    left = [i for i in item[1:] if lcomp(i, first)]
    right = [i for i in item[1:] if rcomp(i, first)]
    return _quick(left, reverse) + [first] + _quick(right, reverse)

# public facade
def quick(item, reverse):
    # clears `item` and "re-fill" it with the result so
    # we have in-place sorting
    item[:] = _quick(item, reverse)
0 голосов
/ 30 сентября 2019

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

def mutate(a):
    b = [1,2,3]
    a.clear()
    a += b

a = [4,5,6]
print(a)
mutate(a)
print(a)

Но я не уверен, зачем вам это нужно.

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