How do I modify this code to sort list using keyword argument?

Python’s list method sort includes the keyword argument reverse, whose default value is False. The programmer can override this value to sort a list in descending order.

Modify the selectionSort function discussed in this chapter so that it allows the programmer to supply this additional argument (as the second parameter) to redirect the sort.

This is what I have so far:

def selectionSort(lyst,reverse):
    """Sorts the items in lyst in ascending order."""
    i = 0
    while i < len(lyst) - 1: # Do n – 1 searches
        minIndex = i # for the smallest item
        j = i + 1
        while j < len(lyst): # Start a search
            if lyst[j] < lyst[minIndex]:
                minIndex = j
            j += 1
        if minIndex != i: # Swap if necessary
            swap(lyst, minIndex, i)
        i += 1

def swap(lyst, x, y):
    """Exchanges the elements at positions x and y."""
    lyst[x], lyst[y] = lyst[y], lyst[x]
        
def main():
    """Tests with four lists."""
    lyst = [2, 4, 3, 0, 1, 5]
    selectionSort(lyst)
    print(lyst)
    lyst = list(range(6))
    selectionSort(lyst)
    print(lyst)
    lyst = [2, 4, 3, 0, 1, 5]
    selectionSort(lyst, reverse = True)
    print(lyst)
    lyst = list(range(6))
    selectionSort(lyst, reverse = True)
    print(lyst)

if __name__ == "__main__":
    main()

>Solution :

The first issue is you have defined a second parameter to your function. This will cause your current tests to fail. To fix this, you can set a default to False to keep your existing behavior working.

Check out default arguments

Then based on the flag you can perform different logic. See the code notes below, we add a check to see if reverse is True or False. if default or set to False we will do normal order. if True, we will do your current logic backwards, using max instead of min.

def selectionSort(lyst,reverse=False):
    """Sorts the items in lyst in ascending order."""
    if not reverse:
        # do your old code
        i = 0
        while i < len(lyst) - 1: # Do n – 1 searches
            minIndex = i # for the smallest item
            j = i + 1
            while j < len(lyst): # Start a search
                if lyst[j] < lyst[minIndex]:
                    minIndex = j
                j += 1
            if minIndex != i: # Swap if necessary
                swap(lyst, minIndex, i)
            i += 1
    if reverse:
        # reverse your code
        i = 0
        while i < len(lyst) - 1: # Do n – 1 searches
            maxIndex = i # for the largest item
            j = i + 1
            while j < len(lyst): # Start a search
                if lyst[j] > lyst[maxIndex]:
                    maxIndex = j
                j += 1
            if maxIndex != i: # Swap if necessary
                swap(lyst, maxIndex, i)
            i += 1

def swap(lyst, x, y):
    """Exchanges the elements at positions x and y."""
    lyst[x], lyst[y] = lyst[y], lyst[x]
        
def main():
    """Tests with four lists."""
    lyst = [2, 4, 3, 0, 1, 5]
    selectionSort(lyst)
    print(lyst)
    # test with trues
    lyst = [2, 4, 3, 0, 1, 5]
    selectionSort(lyst, True)
    print(lyst)
    lyst = list(range(6))
    selectionSort(lyst)
    print(lyst)
    lyst = [2, 4, 3, 0, 1, 5]
    selectionSort(lyst, reverse = True)
    print(lyst)
    lyst = list(range(6))
    selectionSort(lyst, reverse = True)
    print(lyst)

if __name__ == "__main__":
    main()

Now that the difference in the parameter is explained, you could further improve your code based on the single operation being changed:

i = 0
while i < len(lyst) - 1: # Do n – 1 searches
    index = i # for the item
    j = i + 1
    while j < len(lyst): # Start a search
        if not reverse:
          if lyst[j] < lyst[index]:
              index = j
        else:
          if lyst[j] > lyst[index]:
              index = j
        j += 1
    if index != i: # Swap if necessary
        swap(lyst, index, i)
    i += 1

Leave a Reply