簡體   English   中英

Class 對象的排序列表按名稱(str)屬性和土耳其語字母順序

[英]Sorting List of Class Objects by their name(str) attribute with Turkish alphabetic order

您好,我正在嘗試對 Player class 對象進行排序,並將其名稱存儲為它們的屬性,如下所示

class Player:
def __init__(self,license_no):
    self.license = license_no
    self.name = input('Oyuncunun adını ve soyadını giriniz: ').replace('ı','I').replace('i','İ').upper()
    self.fide_rating = get_ratings('Oyuncunun FIDE kuvvet puanını giriniz: ')
    self.national_rating = get_ratings('Oyuncunun ulusal kuvvet puanını giriniz: ')
    self.points = 0

我將這些對象放在一個列表中,我想按它們的名稱屬性對該列表進行排序。 我可以通過操作員來完成。 所有這些都與英文字母順序一起很好,但我需要按土耳其字母對它們進行排序,其中包含“Ç”、“Ö”等字符。我該怎么做才能得到任何幫助?

您是否正在嘗試 go 類似的東西?

class S:
  def __init__(self, name):
    self.name = name


c = [S('ç'), S('a')]

# we create a dictionary with the index of the current object in the c list as key
# and name as value
name_to_sort= {}
for ind, obj in enumerate(c):
  name_to_sort[ind]=getattr(obj, 'name')

# in here we sort this dict in base of the values and create a list of list with [index, value]
sorted_by_name = [[k, v] for k, v in sorted(name_to_sort.items(), key=lambda name_to_sort: name_to_sort[1])]

# then in here we create a sorted list by sorting the indexes in the sorted_by_name
# and getting the original object which belonged to that index
sort = []
for ind, val in enumerate(sorted_by_name):
  sort.append(c[val[0]])

# we print the new list by the name
for i in sort:
  print(i.name)

output:

a
ç

我相信我已經使用這里使用的這個名為 PyICU 的庫解決了這個問題: 如何在 Python 中按字母順序對 unicode 字符串進行排序?

import icu # pip install PyICU


collator = icu.Collator.createInstance(icu.Locale('gr_GR'))

letters="abcçdefgğhıijklmnoöprsştuüvyz" #Turkish alphabet


import random

not_names = []

## creating fake names and players 
for i in range(15):
  not_names.append(''.join([random.choice(letters) for a in range(5)]))

class Player:
  def __init__(self,license_no, name):
    self.license = license_no
    self.name = name

players = []

for idx, name in enumerate(not_names):
  players.append(Player(idx, name))

for player in players: print(player.license, player.name)

players.sort(key=lambda d: collator.getSortKey(d.name)) ## sorting done here
print('\n')

for player in players: print(player.license, player.name)

我找到了我的解決方案,因為我為名稱的第一個字符提供了 integer 值。 然后在排序函數中使用它作為鍵,它根據給定的 function 的名稱值對對象進行排序。 最終答案如下: 編輯:通過以下問題編輯代碼,它只查找第一個字母。 現在它正在尋找每一個角色。

class Player:
    def __init__(self,name):
        self.name = name

    def __repr__(self):
        return f'Player(name={self.name})'


def name_sorting(player):
    chars = 'ABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ'
    return [chars.index(player.name[i]) for i in range(len(player.name))]

player_list = [Player('Zeynep'),Player('Ahmet'),Player('Çınar'),Player('Oğuz')]
print(player_list)
print(sorted(player_list, key=name_sorting))

另一種方法是使用str.translate方法,它在兩組字符串之間構建一個翻譯表,如下所示:

>>> ascii_letters = 'abccdefgghiijklmnooprsstuuvyz'
>>> turkish_letters = 'abcçdefgğhıijklmnoöprsştuüvyz'
#Build the translation table, notice how I've added extra chars in second 
#string to account for special Turkish letters. Basically they should have 
#the same length
>>> turkishTable = str.maketrans(turkish_letters, ascii_letters)
>>> 
>>> s = 'Çınar'
>>> 
>>> s.lower().translate(turkishTable)
'cinar'
>>> player_list = ['Zeynep','Ahmet', 'Çınar', 'Oğuz']
>>> 

>>> sorted(player_list, key=lambda s: s.lower().translate(turkishTable))
['Ahmet', 'Çınar', 'Oğuz', 'Zeynep']

然后,您可以在Player class 中添加另一個屬性,並將其命名為self.translated_name ,您可以在其中保存翻譯后的名稱並使用此屬性與operator.attrgetter sort

>>> from operator import attrgetter
>>> sorted(list_of_player_object, key=attrgetter('translated_name'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM