<p>编辑:看起来您甚至不需要实现<code>__eq__</code>。下面的示例不实现<code>__eq__</code></p>
<p>您可以将每个地址映射到实现<code>__lt__</code>和<code>__eq__</code>的单独类,然后根据该类进行排序。例如:</p>
<pre><code>from __future__ import annotations
from typing import Text, Tuple
def parse_address(address: Text) -> Tuple[int, Text]:
"""I haven't extensively tested this yet.."""
first_space = address.find(' ')
if first_space == -1:
raise ValueError('Invalid address')
return int(address[:first_space]), address[first_space + 1:]
class CustomComparator(object):
def __init__(self, address: Text):
self._full_address = address
self._number, self._address = parse_address(address)
def __lt__(self, other: CustomComparator) -> bool:
if self._number != other._number:
return self._number < other._number
return self._address < other._address
# __str__ and __repr__ are just so printing appears cleaner in this case.
def __str__(self) -> Text:
return self._full_address
def __repr__(self) -> Text:
return str(self)
address_list = ['100 Parker St, Springfield, MA', '131 Parker St, Springfield, MA', '102 Boston Rd, Springfield, MA',
'181 Boston Rd, Springfield, MA', '150 King St, Springfield, MA', '103 King St, Springfield, MA',
'103 Boston Rd, Spingfield, MA']
address_list = [CustomComparator(address) for address in address_list]
address_list.sort()
print('\n'.join([str(address) for address in address_list]))
</code></pre>
<p>这将首先对地址进行数字排序,然后按字母顺序排序。在本例中,它打印:</p>
<pre><code>100 Parker St, Springfield, MA
102 Boston Rd, Springfield, MA
103 Boston Rd, Spingfield, MA
103 King St, Springfield, MA
131 Parker St, Springfield, MA
150 King St, Springfield, MA
181 Boston Rd, Springfield, MA
</code></pre>