如何在Python中访问索引,键和值

时间:2014-04-03 11:34:38

标签: python

我有一台发电机:

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方法可以做到这一点?

2 个答案:

答案 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字典生成多个键。