我想和某人核对我是否正确定义了迭代功能。为了说明,请考虑以下示例:
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__
的定义在做错什么?
答案 0 :(得分:2)
您对quick_dict
的第二个定义是使用data
在for sample in data
上进行迭代,同时已经使用for key in data
对其进行了迭代。但是,您的__iter__
和__next__
实现使用单个实例属性来控制迭代,这意味着data
上的嵌套迭代将不起作用,因为对{{1}的第二次(嵌套)调用}重置计数器。为了支持嵌套迭代,请消除__iter__
并让__next__
返回一个生成器:
__iter__