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] &lt; [1, part1] => 不比较 part0part1 因为适应度已经不同了。 [0, part0] &lt; [0, part1] => 确实比较 part0part1 因为适应度相同。

建议一

仅按健身排序: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 会做什么?它选择了哪个元素? @Zaidur sort() 是稳定的,即对于比较相同的两个元素,保留原始顺序。但请注意,您之前刚刚使用随机抽样创建了一个总体。【参考方案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' 的实例之间不支持

Pandas/BigQuery - TypeError:“str”和“int”实例之间不支持“<”

Pandas 合并错误 TypeError:“int”和“str”实例之间不支持“>”