良い答えがたくさん。単なる例として、または簡単な 1 回限りの解析、または宿題の割り当てのためにこれを行っている場合、これらはすべて、文字列の処理/並べ替えが適切であることを示しています。しかし、タイヤ管理に関する実際のアプリを実際に構築している場合は、タイヤの実際のモデルを作成することを検討します。
from ast import literal_eval
from operator import attrgetter
# Make a real object, because we can, and it's easy, and a real object is almost always better than abusing literal types
class Tire(object):
def __init__(self, width = 0, profile = 0, radius = 0): #now we have meaningful names to our indexed fields
self.width = width
self.profile = profile
self.radius = radius
# let's encapsulate the '{width}/{profile}/{radius}' string representation
# as an attribute so we can access/set it like the "real" attributes
@property
def description(self):
return '{}/{}/{}'.format(self.width, self.profile, self.radius)
@description.setter
def description(self, string):
self.width, self.profile, self.radius = map(literal_eval, string.split('/')) #ast.literal_eval() is safer than just eval()
# let's make a class side instance creation method that can instantiate and set the description directly too
@classmethod
def fromDescription(me, descriptionString):
newTire = me()
newTire.description = descriptionString
return newTire
#your original sample input
descriptions = ['285/30/18', '285/30/19', '235/40/17', '315/25/19', '275/30/19']
#now lets make some real tire objects from those
tires = [Tire.fromDescription(each) for each in descriptions]
#make sure they still print
[print(each.description) for each in tires]
print('original sort')
[print(each.description) for each in sorted(tires, key = attrgetter('radius'))]
print('reversed original sort')
[print(each.description) for each in sorted(tires, key = attrgetter('radius'), reverse = True)]
print('width sort')
[print(each.description) for each in sorted(tires, key = attrgetter('width'), reverse = True)]
print('radius>>width>>profile sort')
[print(each.description) for each in sorted(tires, key = attrgetter('radius', 'width', 'profile'))]
このアプローチの価値は、最後に明らかになることを願っています。タイヤ オブジェクトを具体化するために、(コード スペースの点で) 前もって大きな代償を払います。しかし、それができたら、あらゆる種類の方法でそれらを並べ替えることから始めることができます。最初に提示されたアルゴリズムは、文字列表現と目的の並べ替え出力を結合する特定の仮定を考えると、うまく機能します。しかし、最後の行のように (フィールド 3、1、2 でソートするために) ソート出力を変更する必要がある場合、タプルの便利な逆のトリックは機能しなくなります。「それが何であるか」と、それをどのように提示(ソート)するかを分離する方がはるかに優れています(IMO)。そして、それらを並べ替えるだけでなく、後でそれらを処理するためのさらにいくつかの賢い方法を考えるかもしれません.