1 回答

TA貢獻1876條經驗 獲得超5個贊
當您有兩個(weight, chromo)權重相等的對時會發生錯誤,此時 Python 會嘗試比較這些chromo值:
>>> class Chromo:
... pass
...
>>> chromolist = [Chromo(), Chromo()]
>>> fitness_weights = [42, 42]
>>> sorted(zip(fitness_weights, chromolist))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'Chromo' and 'Chromo'
您可以通過使用僅提取權重的自定義排序鍵,或者通過添加對排序序列中的每個值都是唯一的 tie 斷路器來避免此問題,例如計數器:
from itertools import count
chromolist = [x for *_, x in sorted(zip(fitness_weights, count(), chromolist))]
計數器只是為了確保 Python 從不查看Chromo實例,因為現在每個元素都是一個(weight, unique_integer, Chromo)元組:
>>> from itertools import count
>>> sorted(zip(fitness_weights, count(), chromolist))
[(42, 0, <__main__.Chromo object at 0x1038cfa00>), (42, 1, <__main__.Chromo object at 0x103a396d0>)]
排序鍵只是一個生成要比較的值的函數,您可以使用 lambda ( lambda t: t[0]) 或operator.itemgetter()object:
from operator import itemgetter
chromolist = [x for _, x in sorted(zip(fitness_weights, chromolist), key=itemgetter(0))]
key 函數需要單獨遍歷輸入列表,因此速度會稍微慢一些,如這個包含 200 個輸入的簡單計時賽所示:
>>> from timeit import timeit
>>> fw = fitness_weights * 100
>>> cl = chromolist * 100
>>> timeit('sorted(zip(fw, count(), cl))', globals=globals(), number=100000)
1.4618491119981627
>>> timeit('sorted(zip(fw, cl), key=itemgetter(0))', globals=globals(), number=100000)
1.6409574589997646
添加回答
舉報