繁体   English   中英

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

[英]Is it possible to create a python iterator over pre-defined mutable data?

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

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

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

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

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

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

有很多方法可以做你想要的。 您确实可以拥有这样的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类,如果它只是一个迭代器机制 - 我可能会使用列表理解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM