我拥有一个名为Collatz
的类和一个创建该类对象的函数collatz_it
,我正在尝试使用{{3来生成一个数达到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
正如你所看到的,我使用了一个给定数字的collatz猜想生成了达到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}
答案 0 :(得分:3)
任何Python容器的默认表示形式都是使用内容的repr()
输出,而不是str()
。
解决方案是为您提供collatz.Collatz()
实例__repr__
方法(您可以对其进行修补),或使用dict
使用str()
的子类显示内容时{1}}而不是repr()
。
__repr__
中的猴子修补可能非常简单:
collatz.Collatz.__repr__ = collatz.Collatz.__str__
当然,如果这是您的自己的代码,只需在类主体中定义一个__repr__
方法。
答案 1 :(得分:0)
使用一个继承自dict
且具有自己的__repr__
的类,它可以满足您的需求。
答案 2 :(得分:0)
将所需的值存储在此行:
values[count] = i
执行类似
的操作 values[count] = i.value
或
values[count] = str(i)
在最后一种情况下,假设您已为该类编写了__str__
方法:
class Collatz:
...
def __str__(self):
return str(self.value)