dbwebb-se / python

Coursematerial for python
Other
34 stars 33 forks source link

återkoppling på students sortering i kmom06 analyzer #56

Open AndreasArne opened 3 years ago

AndreasArne commented 3 years ago

Här kommer återkoppling på funktionen en student har skapat för att sortera datan i dictionarien korrekt.

Här är koden och nedanför finns återkopplingen.

def lexicographical_sort(dict_to_sort):
    """
    sorts a dictionary lexicographycally
    """
    unique_values_list = []
    # create a list of unique values
    for value in dict_to_sort.values():
        if value in unique_values_list:
            pass
        else:
            unique_values_list.append(value)
    # sort values
    unique_values_list.sort(reverse=True)

    sorted_dictionary = {}
    # create a list for multiple values, add to new dictionary
    for _outer_key, outer_value in enumerate(unique_values_list):
        multiple_values_for_key = []
        for inner_key, inner_value in dict_to_sort.items():
            if outer_value == inner_value:
                multiple_values_for_key.append(inner_key)
        multiple_values_for_key.sort(reverse=True)
        sorted_dictionary[outer_value] = tuple(multiple_values_for_key)

    return sorted_dictionary

Du har gjort en väldigt avancerad sorteringslösning. Det tog lite tid för mig att komma på exakt vad du gjorde i den.

Jag har inte så mycket att säga om hur koden är skriven, jag hittade bara ett par små saker.

Följande if-sats hade jag ändrat på.

if value in unique_values_list:
    pass
else:
    unique_values_list.append(value)

Det är onödigt med en tom if-sats, då är det bättre att kolla specifikt efter att saken inte stämmer.

if value not in unique_values_list:
    unique_values_list.append(value)

Jag hade döpt om _outer_key till bara _ i for-loopen så det blir tydligare att den inte används.

    for _, outer_value in enumerate(unique_values_list):

Däremot hade jag gjort sorteringen på ett annat sätt. Det finns ett lättare sätt att få till sortering på flera värden och det är med hjälp av tupler.

Precis som när man sorterar en sträng, när man sorterar tupler så jämförs ett elemnt åt gången. Om första elementet är olika jämförs inget mer. Om de är lika går det vidare och jämför nästa element. Med den kunskapen kan vi bygga en lista som innehåller tupler. Tuplerna innehåller värdena i den ordningen som vi vill att det ska sorteras på. T.ex. (value, word).

Så om vi har en dictionary där nycklarna är orden och värdet är antalet förekomster av ordet i texten, då vill vi göra om den till en lista med tupler istället. Där första elementet är värdet och andra värdet nyckeln.

list_with_tuples = []
for word, nr in dict_to_sort.items():
    list_with_tuples.append((nr, word))

När vi sen sorterar listan så kommer den i första hand sortera på antalet förekomster i texten och om de är lika sorteras det på ordet istället.

list_with_tuples.sort(reverse=True)
sorted_dict = {}
for nr, word in list_with_tuples:
    sorted_dict[word] = nr

Och där har vi en sorterad dictionary på förekomst och bokstavsordning.