TypeError:实例Python之间不支持'<'
Posted
技术标签:
【中文标题】TypeError:实例Python之间不支持\'<\'【英文标题】:TypeError: '<' not supported between instances PythonTypeError:实例Python之间不支持'<' 【发布时间】:2017-09-14 15:13:14 【问题描述】:我正在解决 python 3 中的遗传算法问题。我还没有完成完整的代码。每当我完成部分代码时,我都会对其进行测试。
目前,我遇到一个错误:
TypeError: 'part' 和 'part' 的实例之间不支持'
有趣的是,这个错误并不总是出现。有时代码运行流畅并显示所需的输出,但有时会显示此错误。
这是什么原因?
我附上代码和错误消息。 我正在使用 PyCharm。
import random
class part():
def __init__(self, number):
self.number = number
self.machine_sequence = []
def add_volume(self, volume):
self.volume = volume
def add_machine(self, machine_numbers):
self.machine_sequence.append(machine_numbers)
def create_initial_population():
part_family = []
for i in range(8):
part_family.append(part(i))
part_population = []
for i in range(6):
part_population.append(random.sample(part_family, len(part_family)))
for i in part_population:
for j in i:
j.add_volume(random.randrange(100, 200))
return part_population
def fitness(part_family):
sum_of_boundary = []
for i in range(0, 8, 2):
sum_of_boundary.append(sum(j.volume for j in part_family[i:i + 2]))
fitness_value = 0
for i in range(len(sum_of_boundary) - 1):
for j in range(i + 1, len(sum_of_boundary)):
fitness_value = fitness_value + abs(sum_of_boundary[i] - sum_of_boundary[j])
return fitness_value
def sort_population_by_fitness(population):
pre_sorted = [[fitness(x),x] for x in population]
sort = [x[1] for x in sorted(pre_sorted)]
for i in sort:
for j in i:
print(j.volume, end = ' ')
print()
return sort
def evolve(population):
population = sort_population_by_fitness(population)
return population
population = create_initial_population()
population = evolve(population)
错误信息:
输出是(每次都是随机的):
【问题讨论】:
我建议你下载并使用a command prompt which allows copying,这样你就不需要在你的问题中添加不必要的截图了。 【参考方案1】:鉴于pre_sorted
是包含[fitness, part]
项的列表的列表,因此每当比较具有相同fitness
的两个子列表时,都会发出嘶嘶声。
Python 列表按字典顺序排序,并按元素从左到右进行比较,直到找到不匹配的元素。在您的情况下,仅当两个部分的适应度相同时才访问第二个元素 (part
)。
[0, part0] < [1, part1]
=> 不比较 part0
和 part1
因为适应度已经不同了。
[0, part0] < [0, part1]
=> 确实比较 part0
和 part1
因为适应度相同。
建议一
仅按健身排序:sorted(pre_sorted, key=operator.itemgetter(0))
建议二
阅读functools.total_ordering
的文档给part
一个总订单:
@total_ordering
class part():
[...]
def __lt__(self, other):
return self.number < other.number
是的,对列表进行排序似乎是错误的。内部元素最好是元组,所以你不会意外修改内容。
【讨论】:
非常感谢!有用!但是当我使用 operator.itemgetter(0) 只比较第一个元素的适应度时,如果有相同的适应度,python 会做什么?它选择了哪个元素? @Zaidursort()
是稳定的,即对于比较相同的两个元素,保留原始顺序。但请注意,您之前刚刚使用随机抽样创建了一个总体。【参考方案2】:
所以pre_sorted
是一个包含[int, part]
元素的列表。当您对该列表进行排序并有两个具有相同整数值的元素时,它会比较 part
值以尝试确定哪个先出现。但是,由于您没有确定零件是否小于零件的功能,因此会引发该错误。
尝试添加函数__lt__(self, other)
以便能够订购零件。
More on operators here
【讨论】:
以上是关于TypeError:实例Python之间不支持'<'的主要内容,如果未能解决你的问题,请参考以下文章
获取 TypeError:“NoneType”和“int”实例之间不支持“<=”
Spark - TypeError:'str'和'int'的实例之间不支持'<='
如何解决 TypeError:'int' 和 'str' 的实例之间不支持'<'?
如果 xldate < 0.00: TypeError: '<' 在 'str' 和 'float' 的实例之间不支持