<p>如果您确实需要自定义排序顺序,那么您可以使用排序逻辑编写一个自定义对象,该对象将作为下面实际对象的包装器。在</p>
<pre><code>from functools import total_ordering
# total_ordering keeps you from having to write each of
# __gt__, __ge__, __lt__, __le__. It requires __eq__ and one of the
# other comparison functions to be defined and the rest are assumed
# in terms of each other. (__ge__ = __gt__ or __eq__, __gt__ = not __le__), etc.
@total_ordering
class CustomSorter(object):
def __init__(self, data):
self.data = data
# the properties here are solely to make the code a little more readable
# in the rich comparators below. You can ignore them if you like.
@property
def serial_number(self):
return self.data[1]["serial_number"]
@property
def site_location(self):
return self.data[1]["site_location"]
def __eq__(self, other):
if not isinstance(other, CustomSorter):
raise NotImplementedError("CustomSorters can only sort with themselves")
return self.data[1] == other.data[1]
def __lt__(self, other):
if not isinstance(other, CustomSorter):
raise NotImplementedError("CustomSorters can only sort with themselves")
if self.site_location == other.site_location:
return self.site_number < other.site_number
else:
return not (self.site_location < other.site_location)
</code></pre>
<p>然后用传统的装修整理去装饰的步骤。在</p>
^{pr2}$
<p>这可能是最好的,如果你实现一个函数来为你排序。在</p>
<pre><code>def sort_on(sorter, unsorted):
"""sort_on expects @sorter@ to be a class with rich comparison operations
that is a decorative wrapper around some data to be sorted. Additionally,
@sorter.data@ should refer to the underlying data structure.
"""
decorated = [sorter(unsort) for unsort in unsorted]
decosorted = decorated.sort()
sorted = [decosort.data for decosort in decosorted]
return sorted
result = sort_on(CustomSorter, myDict.items())
</code></pre>