gpt4 book ai didi

python - 使用 iter func 进行字典迭代

转载 作者:行者123 更新时间:2023-12-01 04:54:32 26 4
gpt4 key购买 nike

我正在尝试使用这个迭代我的字典:

it = iter(db)
for i in it:
print(i)

但是当我运行这个时,会发生一个无限循环,将字典作为一个整体打印,而不是在字典的键上打印

我用它作为输入:

ppl = Course(123, 'Principles of Programming Languages') 
os = Course(133, 'Operating Systems')
db = DB()
db.setCourse(ppl, 'SE', 2, 1)
db.setCourse(os, 'SE', 3, 1)

我的输出是:

{123: ('Principles of Programming Languages', 'SE', 2, 1), 133: ('Operating Systems', 'SE', 3, 1)}
{123: ('Principles of Programming Languages', 'SE', 2, 1), 133: ('Operating Systems', 'SE', 3, 1)}
{123: ('Principles of Programming Languages', 'SE', 2, 1), 133: ('Operating Systems', 'SE', 3, 1)}

无限循环。我很确定我的下一个搞砸了。

编辑DB 代码很长,这是它的 iter 部分:

class DB()
DataBase = {}
def __iter__(self):
return iter(self.DataBase)
def getCourse(self,cnum):
for i in self.DataBase:
if i == cnum:
return self.DataBase[i]
def getCoursesByDept(self,dept):
for key, value in self.DataBase.items():
if dept in value:
return self.DataBase[key]
def getCoursesByDeptYear(self,dept,year):
for key, value in self.DataBase.items():
if dept in value and year in value:
return self.DataBase[key]
def getCoursesByDeptYearSem(self,dept,year,semester):
for key, value in self.DataBase.items():
if dept in value and year in value and semester in value:
return self.DataBase[key]
def setCourse(self,Course,dept,year,semester):
self.DataBase[Course.cnum] = (Course.name,dept,year,semester)
def removeCourse(self,cnum):
for i in self.DataBase.keys():
if i == cnum:
del self.DataBase[i]

正确的输出是:

Course 123: Principles of Programming Languages 
Course 133: Operating Systems

最佳答案

看起来最简单的解决方法是:

class DB():
...
def __iter__(self):
return iter(self.DataBase)

并取出__next__方法。

要创建自己的,您需要自己在__iter__中遍历 key 。 :

    def __iter__(self):
for key in self.Database:
yield key

它创建了一个生成器,但你仍然不需要 __next__ ;如果您必须拥有 __next__ ,那么你需要收集 key ,然后将它们一一归还。

返回每个 key 后,您需要 raise StopIteration每次__next__再次被调用——这意味着你只能迭代一次——最好坚持使用上述两个选项之一。

您当前遇到无限循环的原因是每次 __next__被称为您返回整个字典 - 不检查您是否完成。

参见this answer有关创建迭代器的更全面的说明。

<小时/>

如果你想要你的DB类看起来与 dict 相同,然后添加keys() , items() ,和values() ;如果您不关心或不需要这些,则可以选择上面的第二个选项,也可以创建自己的选项。第二个选项可能如下所示:

    def __iter__(self):
for key, value in self.Database.items():
yield key, value

这里发生的是对于每个 key , value配对DB ,迭代时都返回。所以你原来的循环应该是这样的:

it = iter(db)
for k, v in it:
print('%s: %s' % (k, v))

关于python - 使用 iter func 进行字典迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27744319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com