是否可以在预定义的可变数据上创建python迭代器?

时间:2010-05-30 22:05:26

标签: python class iterator

我可能做错了,如果我是,请告诉我,但我很好奇以下是否可能:

我有一个包含许多词典的类,每个词典都将名称与给定类的不同对象集合配对。例如:

items = {"ball" : ItemInstance1, "sword" : ItemInstance2}
people = {"Jerry" : PersonInstance1, "Bob" : PersonInstance2, "Jill" : PersonInstance3}

我的班级将保留当前可用的项目和人员,随着州的变化,这些项目可能会发生变化:

Class State:
    def __init__(self, items, people):
        self.items = items
        self.people = people

我想定义一个 iter ()和next()方法,以便迭代其属性中的所有值。我的第一个问题是这是否可行。如果是,它是否能够支持如下情况:

我按上述方式定义了项目和人员:

state = State(items, people)
for names, thing in state:
    print name + " is " + thing.color

items[cheese] = ItemInstance3
for names, thing in state:
    print name + " weighs " + thing.weight

虽然我觉得这对我的代码有用,但我不知道它是可能的还是正确的方法。我读过的关于用户定义迭代器的所有内容都表明它们的每个实例都只是一个用途。

2 个答案:

答案 0 :(得分:2)

如果我理解你的问题是正确的,那么在你的课堂上添加以下方法应该这样做:

def __iter__(self):
    import itertools
    return itertools.chain(self.items.itervalues(), self.people.itervalues())

这将两个迭代器链接在一起,这里选择的迭代器的值为items和值people

为了让你的后期代码工作,你需要迭代这些项 - 键值对。在这种情况下,这样做:

def __iter__(self):
    import itertools
    return itertools.chain(self.items.iteritems(), self.people.iteritems())

答案 1 :(得分:1)

有很多方法可以做你想要的。你确实可以拥有这样一个State类,并实现 iter ()方法(http://docs.python.org/library/stdtypes.html)。

您还可以创建生成器函数:

   def iterate_two(l1, l2):
      for k in l1:
         yield k, l1[k]
      for k in l2:
         yield k, l2[k]

您可以使用itertools.chain。您可以使用列表推导和生成器表达式。等

我个人不会像你建议的那样创建State类,如果它只是一个迭代器机制 - 我可能会使用列表理解。