Υπάρχει και πιο απλός τρόπος να κάνεις το συγκεκριμένο χωρίς να γράψεις συνάρτηση.
Ο παραπάνω όμως τρόπος σε καλύπτει για όλες τις περιπτώσεις
Υπάρχει ένα μικρό θέμα με τον παραπάνω τρόπο: κάθε φορά που θέλεις να προσθέσεις μία κατηγορία, θα πρέπει να τροποποιείς τη συνάρτηση custom_sort. Επίσης, η λογική if-elif-else δεν είναι πρακτική σε αυτή την περίπτωση, γιατί αν έχεις 50 κατηγορίες, θα πρέπει να βάλεις αντίστοιχο αριθμό κλάδων elif.
Αντί για συνάρτηση, μπορούμε να χρησιμοποιήσουμε ένα λεξικό:
job_order = {'Μηχανικός': 1, 'Προγραμματιστής': 2, 'Γραφίστας': 3}
sorted(my_list, key = lambda x: job_order.get(x[3], len(sd)+1))
όπου:
- δημιουργεί μία ανώνυμη συνάρτηση f(x) για μία παράμετρο x
<λεξικό>.get(<κλειδί>, <προεπιλεγμένη τιμή>)
επιλέγει ένα κλειδί από ένα λεξικό και αν αυτό δεν υπάρχει, επιστρέφει την προεπιλεγμένη τιμή.
Η προεπιλεγμένη τιμή σε αυτή την περίπτωση είναι το μήκος του λεξικού συν 1 (ακολουθώντας τη λογική του else τμήματος στην εκδοχή του Theo)
Αυτή η τελευταία λεπτομέρεια μπορεί να ενσωματωθεί σε μία δική μας επέκταση του βασικού λεξικού, όπου μπορούμε να τροποποιήσουμε τη βασική μέθοδο __getitem__:
class MyDict(dict):
def __getitem__(self, key):
if key in self:
return super().get(key)
else:
return len(self) + 1
Αν το κλειδί key υπάρχει στο MyDict, τότε το επιστρέφει από τις τιμές της βασικής κλάσης, που είναι το dict. Αν πάλι δεν υπάρχει το κλειδί, τότε επιστρέφει το νούμερο <πλήθος κλειδιών> + 1.
Οπότε τώρα μπορούμε να απλοποιήσουμε τη βασική υλοποίηση
job_order = MyDict({'Μηχανικός': 1, 'Προγραμματιστής': 2, 'Γραφίστας': 3})
sorted(my_list, key = lambda x: job_order[x[3]])
Τι κερδίσαμε με το παραπάνω;
Αν θέλουμε προσθαφαιρέσουμε επαγγέλματα, απλά αλλάζουμε το λεξικό, αντί να τροποποιούμε μία συνάρτηση. Επίσης, για μεγάλο αριθμό επαγγελμάτων, απλά έχουμε περισσότερα ζεύγη κλειδή-τιμή στο λεξικό, αντί για ένα τεράστιο μπλοκ εντολών if-elif-else.
Υ.Γ.
Αν κάποιος τώρα θέλει να χρησιμοποίσει συνάρτηση στην sorted, γιατί ίσως είναι φαίνεται πιο απλή η σύνταξη, τότε μπορεί να συνδυάσει τα παραπάνω:
def custom_sort(obj):
return job_order[obj[3]]
Εδώ το λεξικό job_order θα πρέπει να χρησιμοποιηθεί σαν global μεταβλητή, που δεν είναι και η καλύτερη πρακτική.
Καλύτερα, θα μπορούσαμε να κάνουμε χρήση της partial από τη βασική βιβλιοθήκη functools
from functools import partial
def custom_sort(obj, d):
return d[obj[3]]
sorted(my_list, key=partial(custom_sort, d=job_order)
όπου η συνάρτηση
partial(<συνάρτηση>, <παράμετρος της συνάρτησης>=<τιμή>, <παράμετρος της συνάρτησης>=<τιμή>, ...)
επιστρέφει μία συνάρτηση η οποία στην υπογραφή της έχει μόνο τις παραμέτρους που περισσέψανε, αν από όλες αφαιρέσουμε αυτές που καθορίσαμε. Πχ. το
partial(custom_sort, d=job_order)
επιστρέφει μια συνάρτηση ίδια με την custom_sort, αλλά υπογραφή custom_sort(obj) μόνο, καθώς έχουμε ήδη περάσει τιμή για την παράμετρο d.
Ένα τελευταίο σχόλιο: καλό είναι να μην χρησιμοποιούμε δεσμευμένες από την Python λέξεις, όπως το object.
Ελπίζω να βοήθησα.