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



我想与某人核实我是否正确定义了迭代函数。为了解释,请考虑以下示例:

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__的定义有什么错误?

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

def __iter__(self):
i = -1
while i < len(self.samples)-1:
i += 1
yield self.samples[i]

最新更新