Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Καλησπέρα σας!

Έχω την παρακάτω λίστα, στην οποία οταν χρησιμοποιώ την .sort δεν μου τα βγάζει όπως τα περίμενα. Γνωρίζω ότι ο κάθε χαρακτήρας έχει τον δικό του αριθμό και ότι με αυτούς τους αριθμούς γίνοται οι συγκρίσεις για να βγει η αλφαβητική σειρά. Η ερώτηση μου είναι, πως μπορώ να αλλαξώ τους αριθμούς αυτούς, ώστε π.χ. τα " Ί, Ϊ " να είναι ίδια με το "Ι" ; Δηλαδή, έτσι:  [ "Ά" , "Α" ,  "Β" , "Γ" , "Έ", "Ε", "Θ", "Ι", "Ί", "Ϊ","Κ","Λ"]

 

g = ["Ά","Β","Α","Ί","Ι","Θ","Κ","Λ","Ϊ","Γ","Ε","Έ"]

g.sort()

print(g)

 

# ['Ά', 'Έ', 'Ί', 'Α', 'Β', 'Γ', 'Ε', 'Θ', 'Ι', 'Κ', 'Λ', 'Ϊ'] - Αποτέλεσμα

Επεξ/σία από user0x
Δημοσ. (επεξεργασμένο)

Ρεαλιστικά μιλώντας, η καλύτερη λύση είναι να χρησιμοποιήσεις μία 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 για παραδείγματα

 

Επεξ/σία από pmav99
Δημοσ.

Άλλος τρόπος-εφόσον έχεις συγκεκριμένους χαρακτήρες-είναι να τους βάλεις σε ένα 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 😁

 

Δημοσ.
# -*- 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

Δημοσ.

Απλά για να το δεις

Αφού κάθησες και όρισες το 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

Δημοσ.
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👍

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...