[英]sorting list of objects by attribute values, order of attribute values are in another list
[英]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.