Py学习  »  Python

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

Wilduck • 5 年前 • 1029 次点击  

我可能做错了,如果是的话,请告诉我,但我很好奇是否可能发生以下情况:

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

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

我想定义一个 伊特尔 ()和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

虽然我觉得这在我的代码中是有用的,但我不知道这是可能的还是正确的方法。关于用户定义的迭代器,我所读到的所有内容都建议它们的每个实例只能使用一次。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30330
 
1029 次点击  
文章 [ 2 ]  |  最新文章 5 年前
Py站长
Reply   •   1 楼
Py站长    5 年前

还可以的

Colin
Reply   •   2 楼
Colin    13 年前

有很多方法可以做你想做的事。您确实可以拥有这样一个状态类,并实现 伊特尔 ()方法 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。可以使用列表理解和生成器表达式。等。

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

awatts
Reply   •   3 楼
awatts    13 年前

如果我正确理解您的问题,那么向您的类中添加以下方法应该可以做到:

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