Я занимаюсь этим маленьким упражнением ... Я хочу изменить порядок строк на основе какого-то странного словаря. Например, согласно моему словарю, письма приходят в порядке: «а», «б», «г», «C», «F», «е»Наследование от "str" class
Так я понял, что я должен просто перегрузить оператор < для строк и вызова отсортирован()
Здесь идет:
class MyString(str):
new_dict = dict((x,i) for i,x in enumerate(["a", "b", "d", "c", "f", "e"]))
def __lt__(self,other):
return self.new_dict[self] < self.new_dict[other]
def __init__(self,x):
str.__init__(self,x)
а потом
In [59]: sorted((MyString(x) for x in "abcdef"))
Out[59]: ['a', 'b', 'd', 'c', 'f', 'e']
Это потрясающе. Или даже:
In [64]: MyString("".join(sorted((MyString(x) for x in "abcdef"))))
Out[64]: 'abdcfe'
Но почему я не могу просто сделать sorted(MyString("abcdef"))
?
In [70]: sorted(MyString("abcdef"))
Out[70]: ['a', 'b', 'c', 'd', 'e', 'f']
По-видимому, итератор MyString возвращает строки.
In [72]: for i in MyString("abcdef"):
print type(i)
....:
<type 'str'>
<type 'str'>
<type 'str'>
<type 'str'>
<type 'str'>
<type 'str'>
Что произойдет, если я позвоню присоединиться на MyString:
In [63]: type(MyString("").join(sorted((MyString(x) for x in "abcdef"))))
Out[63]: str
Почему MyString есть ул итераторы?
'отсортирован()' принимает ключ вместо этого вы можете определить значение сортировки для отсортированных элементов. –
В противном случае сортировка использует '>', '> =', '<=' и '==' также, вам необходимо предоставить * all * операторов. –