我有一台发电机:
def get_items(self):
for item in self.info.get_data():
item = {
'_name': item.name,
'_email': item.email,
}
yield item
我想迭代这个生成器,为每个项目键分配索引,然后将它们存储在dict中,如下所示:
items = ['item_0_name': 'example name', 'item_0_email': 'example@email.com',
'item_1_name': 'Some name', 'item_1_email': 'ex@mail.com' ....]
我使用enumerate来获取索引,但是我无法访问item的键来为其添加索引:
items = []
for i, item in enumerate(self.get_items()):
items['item_'.join(str(i)).join(self.get_items()[i])] = item
但后来我得到了:
TypeError: 'generator' object has no attribute '__getitem__
有没有Pythonic方法可以做到这一点?
答案 0 :(得分:3)
尝试以下方法:
items = []
for i, item in enumerate(self.get_items()):
items.append({'item_{}{}'.format(i, k): v for k, v in item.iteritems()})
列表演示:
In [54]: for i, j in enumerate(get_items(test)):
items.append({'item_{}{}'.format(i, k): v for k, v in j.iteritems()})
....:
In [55]: items
Out[55]:
[{'item_0_email': 'example@email.com', 'item_0_name': 'example_name'},
{'item_1_email': 'ex@email.com', 'item_1_name': 'Some name'}]
我认为您实际想要做的是将这些词典附加到列表中,因为,items
被定义为列表。否则,如果要将这些添加到字典中,请执行以下操作:
items = {} # Items is now a dictionary
for i, item in enumerate(self.get_items()):
items.update({'item_{}{}'.format(i, k): v for k, v in item.iteritems()})
字典演示
In [56]: items = {}
In [57]: for i, j in enumerate(get_items(test)):
items.update({'item_{}{}'.format(i, k): v for k, v in j.iteritems()})
....:
In [58]: items
Out[58]:
{'item_0_email': 'example@email.com',
'item_0_name': 'example_name',
'item_1_email': 'ex@email.com',
'item_1_name': 'Some name'}
请记住,self.get_items()
会产生词典。这意味着你将不得不处理字典中的所有项目。而上述方法正是如此。
代码使用dict comprehensions
。它们就像列表推导一样,但在这种情况下,迭代self.get_items()
生成器产生的每个字典的键和值。
答案 1 :(得分:2)
你得到的错误是因为self.get_items()
是一个生成器,而且这样的对象不允许做self.get_items()[1]
这样的事情,因为就意义而言,没有历史。< / p>
但是在你的情况下,你错过了self.get_items()
在每次通话时产生一个字典。你只需要使用那个词:
items = []
for i, item_dict in enumerate(self.get_items()):
for key, item in item_dict:
items['item_{0}{1}'.format(i, key)] = item
顺便说一句,你有另一个强烈的错误(我在上面的示例中没有更正):items
是一个列表,所以你尝试items[some_not_yet_defined_string] = something
的尝试将失败,首先是因为索引是str
类型,其次是因为您无法通过指定新索引将内容附加到列表中。
此外,您对'item_'.join(str(i)).join [...]
的调用并非您所期望的:str.join(iterable)
返回由给定str
分隔的可迭代项组成的字符串。它没有生成多个字符串,肯定不会为您的items
字典生成多个键。