1

我拥有一个名为的类Collatz和一个创建该类对象的函数,我正在尝试使用collat​​z conjucturecollatz_it生成一个数字达到 1 的步数,并使用生成器生成它们对应的步数,直到 100 万

import collatz
values = {}
count = 0
#collatz.collatz_it(n)

def gen():
    n = 0
    x = 0
    while True:
        yield x
        n += 1
        x = collatz.collatz_it(n)

for i in gen():
    count += 1
    values[count] = i
    print values
    if count == 1000000:
        break

如您所见,我使用给定数字的 collat​​z 猜想生成了达到 1 所需的步数,并将其添加到具有相应数字的字典中,但是当我打印出字典值时,它的输出有点像这个:

{1: 0}
{1: 0, 2: <collatz.Collatz instance at 0x01DCA580>}
{1: 0, 2: <collatz.Collatz instance at 0x01DCA580>, 3: <collatz.Collatz instance at 0x01DCDF58>}
{1: 0, 2: <collatz.Collatz instance at 0x01DCA580>, 3: <collatz.Collatz instance at 0x01DCDF58>, 4: <collatz.Collatz instance at 0x01DCDFA8>}
{1: 0, 2: <collatz.Collatz instance at 0x01DCA580>, 3: <collatz.Collatz instance at 0x01DCDF58>, 4: <collatz.Collatz instance at 0x01DCDFA8>, 5: <collatz.Collatz instance at 0x01DCDEB8>}
{1: 0, 2: <collatz.Collatz instance at 0x01DCA580>, 3: <collatz.Collatz instance at 0x01DCDF58>, 4: <collatz.Collatz instance at 0x01DCDFA8>, 5: <collatz.Collatz instance at 0x01DCDEB8>, 6: <collatz.Collatz instance at 0x01DCDE90>}
{1: 0, 2: <collatz.Collatz instance at 0x01DCA580>, 3: <collatz.Collatz instance at 0x01DCDF58>, 4: <collatz.Collatz instance at 0x01DCDFA8>, 5: <collatz.Collatz instance at 0x01DCDEB8>, 6: <collatz.Collatz instance at 0x01DCDE90>, 7: <collatz.Collatz instance at 0x01DE8940>}

如果我打印print i而不是print values得到所需的输出,这基本上是因为该print语句触发了__str__类中的方法

有没有什么方法可以在不输入的情况下将实际步骤添加到字典<collatz.Collatz instance at 0x01DCDFA8>中,是否有任何从方法中检索数据的__str__方法,以便我的字典看起来像这样:

{1: 0}
{1: 0, 2: 1}
{1: 0, 2: 1, 3: 7}
4

3 回答 3

3

任何 Python 容器的默认表示是使用repr()内容的输出,而不是str().

解决方案是为您提供collatz.Collatz()实例一个__repr__方法(您可以对其进行猴子修补),或者使用该方法的子类而不是在显示内容时dict使用。str()repr()

在 a 中进行猴子修补__repr__可能很简单:

collatz.Collatz.__repr__ = collatz.Collatz.__str__

当然,如果这是您自己的代码,只需__repr__在类主体中定义一个方法即可。

于 2013-07-03T16:30:37.600 回答
0

使用一个继承自dict并拥有自己的类的类,它可以满足__repr__您的需求。

于 2013-07-03T16:28:44.827 回答
0

将您想要的值存储在此行上:

values[count] = i

做类似的事情

values[count] = i.value

或者

values[count] = str(i)

在最后一种情况下,假设您已经__str__为该类编写了一个方法:

class Collatz:
...
def __str__(self):
    return str(self.value)
于 2013-07-03T16:46:50.047 回答