user0x Δημοσ. 20 Ιουλίου 2018 Δημοσ. 20 Ιουλίου 2018 (επεξεργασμένο) Καλησπέρα σας! Έχω την παρακάτω λίστα, στην οποία οταν χρησιμοποιώ την .sort δεν μου τα βγάζει όπως τα περίμενα. Γνωρίζω ότι ο κάθε χαρακτήρας έχει τον δικό του αριθμό και ότι με αυτούς τους αριθμούς γίνοται οι συγκρίσεις για να βγει η αλφαβητική σειρά. Η ερώτηση μου είναι, πως μπορώ να αλλαξώ τους αριθμούς αυτούς, ώστε π.χ. τα " Ί, Ϊ " να είναι ίδια με το "Ι" ; Δηλαδή, έτσι: [ "Ά" , "Α" , "Β" , "Γ" , "Έ", "Ε", "Θ", "Ι", "Ί", "Ϊ","Κ","Λ"] g = ["Ά","Β","Α","Ί","Ι","Θ","Κ","Λ","Ϊ","Γ","Ε","Έ"] g.sort() print(g) # ['Ά', 'Έ', 'Ί', 'Α', 'Β', 'Γ', 'Ε', 'Θ', 'Ι', 'Κ', 'Λ', 'Ϊ'] - Αποτέλεσμα Επεξ/σία 20 Ιουλίου 2018 από user0x
pmav99 Δημοσ. 20 Ιουλίου 2018 Δημοσ. 20 Ιουλίου 2018 (επεξεργασμένο) Ρεαλιστικά μιλώντας, η καλύτερη λύση είναι να χρησιμοποιήσεις μία 3rd party library: unidecode, pyicu https://stackoverflow.com/questions/517923/what-is-the-best-way-to-remove-accents-in-a-python-unicode-string/518232#518232 https://stackoverflow.com/questions/3412933/python-not-sorting-unicode-properly-strcoll-doesnt-help/3413436#3413436 Εναλλακτικά, η συνάρτηση sorted() καθώς και η μέθοδος list.sort() παίρνουν ένα argument που λεγεται key. Το argument αυτό μπορεί να είναι ένα callable, μία συνάρτηση δηλαδή. Αυτό που πρέπει να κάνεις είναι να γράψεις δηλαδή μια συνάρτηση που να κάνει σωστά το sorting edit Ψέμματα, υπάρχει και η unicodedata στην stdlib. Δες τις απαντήσεις στην πρώτη ερώτηση του stack overflow για παραδείγματα Επεξ/σία 20 Ιουλίου 2018 από pmav99
k33theod Δημοσ. 20 Ιουλίου 2018 Δημοσ. 20 Ιουλίου 2018 Άλλος τρόπος-εφόσον έχεις συγκεκριμένους χαρακτήρες-είναι να τους βάλεις σε ένα dictionary και να τους δώσεις μία τιμή ανάλογα με την ταξινόμηση που θες να κάνεις >>> g = ["Ά","Β","Α","Ί","Ι","Θ","Κ","Λ","Ϊ","Γ","Ε","Έ"] >>> g_dict= {"Ά":1,"Β":3,"Α":2,"Ί":8,"Ι":9,"Θ":7,"Κ":11,"Λ":12,"Ϊ":10,"Γ":4,"Ε":5,"Έ":6,} >>> g.sort(key=lambda i:g_dict[i]) >>> g ['Ά', 'Α', 'Β', 'Γ', 'Ε', 'Έ', 'Θ', 'Ί', 'Ι', 'Ϊ', 'Κ', 'Λ'] >>> Αυτό ταξινομεί το g με βάση την τιμή που έχουν τα στοιχεία του στο g_dict Προτείνω τη λύση του pmav99 😁
user0x Δημοσ. 22 Ιουλίου 2018 Μέλος Δημοσ. 22 Ιουλίου 2018 # -*- coding: utf-8 -*- alphabet = { 'Α': 'α', 'α': 'α', 'Ά': 'α', 'ά': 'α', \ 'Β': 'β', 'β': 'β', \ 'Γ': 'γ', 'γ': 'γ', \ 'Δ': 'δ', 'δ': 'δ', \ 'Ε': 'ε', 'ε': 'ε', 'Έ': 'ε', 'έ': 'ε', \ 'Ζ': 'ζ', 'ζ': 'ζ', \ 'Η': 'η', 'η': 'η', 'Ή': 'η', 'ή': 'η', \ 'Θ': 'θ', 'θ': 'θ', \ 'Ι': 'ι', 'ι': 'ι', 'Ί': 'ι', 'ί': 'ι', 'Ϊ': 'ι', 'ϊ': 'ι', 'ΐ': 'ι', \ 'Κ': 'κ', 'κ': 'κ', \ 'Λ': 'λ', 'λ': 'λ', \ 'Μ': 'μ', 'μ': 'μ', \ 'Ν': 'ν', 'ν': 'ν', \ 'Ξ': 'ξ', 'ξ': 'ξ', \ 'Ο': 'ο', 'ο': 'ο', \ 'Ό': 'ο', 'ό': 'ο', \ 'Π': 'π', 'π': 'π', \ 'Ρ': 'ρ', 'ρ': 'ρ', \ 'Σ': 'σ', 'σ': 'σ', \ 'Τ': 'τ', 'τ': 'τ', \ 'Υ': 'υ', 'υ': 'υ', 'Ύ': 'υ', 'ύ': 'υ', 'Ϋ': 'υ', 'ϋ': 'υ', 'ΰ': 'υ', \ 'Φ': 'φ', 'φ': 'φ', \ 'Χ': 'χ', 'χ': 'χ', \ 'Ψ': 'ψ', 'ψ': 'ψ', \ 'Ω': 'ω','ω': 'ω', 'Ώ': 'ω', 'ώ': 'ω', \ 'ς': 'ς' } def list_to_dict(key, value): words = {} for i in range(len(key)): word = {key[i] : value[i]} words.update(word) return words def Sorting(text): key_ids = [] keys = list(text.keys()) key_len = len(keys) values = list(text.values()) for pos1 in range(key_len): var = keys[pos1] key_id = "" for char in var: key_id += str(alphabet[char]) key_ids.append(str(key_id)) for pos2 in range(key_len): for pos3 in range(key_len): if key_ids[pos2] < key_ids[pos3]: key_ids[pos3], key_ids[pos2] = key_ids[pos2], key_ids[pos3] keys[pos3], keys[pos2] = keys[pos2], keys[pos3] values[pos3], values[pos2] = values[pos2], values[pos3] result = list_to_dict(keys, values) return result gg = {"Αλέξης" : "name", "Βαγγέλης" : "name", "Γιάννης" : "name", "αι": "WORD 1", "ΆΊ" : "WORD 2", "αί" : "WORD 3", "αΊ" : "WORD 4", "Αθηνά" : "WORD 5", "ώΏ" : "WORD 11", "Αθήνα" : "WORD 6", "Κώστας" : "name", "Α" : "WORD 8", "Ω" : "WORD 9"} G = Sorting(gg) print(G) Σας ευχαριστώ πολύ για τις απαντήσεις σας! Πιστεύω πως η παραπάνω συνάρτηση είναι εντάξει. Alph_Order.py
pmav99 Δημοσ. 22 Ιουλίου 2018 Δημοσ. 22 Ιουλίου 2018 Απλά για να το δεις Αφού κάθησες και όρισες το alphabet, μπορείς να το χρησιμοποιήσεις για να αντικαταστήσεις τους τόνους με τα σύμβολα χωρίς αυτούς, οπότε η κλασσική sort δουλεύει κανονικά μετά alphabet = {'Α': 'α', 'α': 'α', 'Ά': 'α', 'ά': 'α', ...} # ... κάνε paste το πλήρες dict words = ['Αλέξης', 'Βαγγέλης', 'Γιάννης', 'αι', 'ΆΊ', 'αί', 'αΊ', 'Αθηνά', 'ώΏ', 'Αθήνα', 'Κώστας', 'Α', 'Ω'] translation = str.maketrans("".join(alphabet.keys()), "".join(alphabet.values())) words_without_accents = [word.translate(translation) for word in words] print(sorted(words_without_accents)) Ο κώδικας είναι για Python 3. Δυστυχώς δεν βρίσκω tutorial σε Python 3 και έχουν αλλάξει λίγο τα imports... H λειτουργία των συναρτήσεων είναι η ίδια πάντως. https://www.tutorialspoint.com/python/string_translate.htm
k33theod Δημοσ. 22 Ιουλίου 2018 Δημοσ. 22 Ιουλίου 2018 7 ώρες πριν, user0x είπε for pos2 in range(key_len): for pos3 in range(key_len): if key_ids[pos2] < key_ids[pos3]: key_ids[pos3], key_ids[pos2] = key_ids[pos2], key_ids[pos3] ++1000👍
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα