【问题标题】:Dictionary iteration with iter func使用 iter func 进行字典迭代
【发布时间】:2015-02-28 21:53:55
【问题描述】:

我试图用这个来迭代我的字典:

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)}

在一个永无止境的循环中。 我很确定我的下一个搞砸了。

编辑 数据库代码很长,这是它的 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 

【问题讨论】:

  • 你忘记分享DB类的代码了。
  • 抱歉,我无法重现该问题。此外,您不需要单独的iter
  • 预期结果是什么?
  • 这是一项硬件任务,她要求我们使用 iter func 或创建我自己的,我宁愿使用令人兴奋的 xD
  • 你想遍历DataBase中的键?

标签: python eclipse python-3.x dictionary iterator


【解决方案1】:

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

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

并取出__next__ 方法。

要创建您自己的,您需要自己在__iter__ 中遍历密钥:

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

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

一旦您返回了每一个键,您需要在每次再次调用 __next__ 时都返回 raise StopIteration - 这意味着您只能迭代一次 - 最好坚持使用上述两个选项之一。

您当前遇到无限循环的原因是每次调用 __next__ 时,您都会返回整个字典 - 不会检查您是否已完成。

请参阅this answer,了解有关创建迭代器的更详尽说明。


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

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

这里发生的情况是,对于DB 中的每个keyvalue 对,都在迭代时返回。所以你原来的循环应该是这样的:

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

【讨论】:

  • 这只是返回给我的关键,我必须在代码的某个地方有另一个问题。
  • @Mike.G:当遍历字典时,键就是返回的内容——还有其他方法可以返回其他内容:.values() 只返回值,__items__只返回项目。
  • 我明白了,那么如何更改它以返回我想要的输出?
  • @Mike.G:查看链接的答案。 :)
  • 我想说结果不是我需要的=[
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
相关资源
最近更新 更多