Python为类的字典理解定义迭代器

时间:2018-10-28 00:00:43

标签: python-3.x dictionary iterator

我想和某人核对我是否正确定义了迭代功能。为了说明,请考虑以下示例:

x=[{'n':'foo', 'a': [1,2,3], 'b':[2,3,5]}, {'n':'baz','a':[4,5,6], 'b':[7,8,9]},
   {'n':'foo', 'a': [4,3,4], 'b':[1,5,6]}, {'n':'bar','a':[1,2,2], 'b':[2,5,6]}]

quick_dict = {key['n']: [sample['a'] for sample in x if sample['n']==key['n']] for key in x}

这按预期工作并输出:

{'foo': [[1, 2, 3], [4, 3, 4]], 'baz': [[4, 5, 6]], 'bar': [[1, 2, 2]]}

我正在尝试为使用__next____iter__方法定义的类做类似的事情。类实例具有许多功能和属性,但是出于这个问题的目的,仅属性samples是重要的,因为它是与上述示例完全相同的字典列表。我将方法定义如下:

def __next__(self):
    if self.itercounter < len(self.samples)-1:
        self.itercounter +=1
        return self.samples[self.itercounter]
    else:
        raise StopIteration

def __iter__(self):
    self.itercounter = -1
    return self

这似乎适用于列表推导,但是对于字典推导则失败。

如果我这样做:

quick_dict = {key['Name']: [sample['CM'] for sample in data if sample['Name'] == key['Name']]
              for key in data.samples}

然后它起作用,因为它直接访问词典列表,并且知道该怎么做。另一方面,如果我这样做

quick_dict = {key['Name']: [sample['CM'] for sample in data if sample['Name'] == key['Name']]
              for key in data}

然后它正在执行我的功能,并且不起作用。它仅返回带有单个键的字典。这里的'CM'只是示例中的'a'之类的键。

我对__iter____next__的定义在做错什么?

1 个答案:

答案 0 :(得分:2)

您对quick_dict的第二个定义是使用datafor sample in data上进行迭代,同时已经使用for key in data对其进行了迭代。但是,您的__iter____next__实现使用单个实例属性来控制迭代,这意味着data上的嵌套迭代将不起作用,因为对{{1}的第二次(嵌套)调用}重置计数器。为了支持嵌套迭代,请消除__iter__并让__next__返回一个生成器:

__iter__