将另一个元素添加到python迭代器中

时间:2013-03-08 00:41:52

标签: python dictionary

我通过一些黑盒函数在python中得到一个对象 oData (被归类为可迭代对象):

oData = someFunction()

当我这样做时:

HttpResponse( oData )

我明白了:

{'A':0.0, 'B':1.0, 'C':1.0 }

我无法做到

HttpResponse( type(oData) ) 

我刚收到500服务器错误。为什么这不只是一个字符串?如何输出我需要的信息?无论如何,这是次要的。

最终我想要做的是将oData作为字典对象,所以我可以像这样添加一个元素:

{ 'A':0.0, 'B':1.0, 'C':1.0, 'New':'myValue' }

我该怎么做?

-----编辑:只是为了澄清一些事情......(并且还省略了上面的一些无关信息)

oData确实是一个不可变对象,带有__iter__()方法的定义。 我寻求的答案可能涉及以某种方式克隆其数据,以便我可以追加它。 我试过这个没有运气

oCopy = ( i for i in oData )

在PHP中,我只是收集键值对并将它们存储到关联数组中。

2 个答案:

答案 0 :(得分:2)

当你打电话给type(oData)时,你会得到一个type对象,这是不可迭代的(这甚至意味着什么?)。

您需要该对象的字符串表示形式。请使用str

HttpResponse( str(type(oData)) ) 

将为您提供该类型的名称,并

oData['New'] = 'myValue'
HttpResponse( str(oData) )

将返回类似

的内容
{ 'A':0.0, 'B':1.0, 'C':1.0, 'New':'myValue' }

答案 1 :(得分:2)

根据您对其他答案的评论,我打赌oDatanamedtuple的列表,HttpResponse正在做某种魔术将其转换为您的结果看到。观察此演示,它会提出您提到的相同错误:

>>> from collections import namedtuple
>>> X = namedtuple('X', ['A', 'B', 'C'])
>>> x = X(1,2,3)
>>> dict([x])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 3; 2 is required

这可以解释为什么你不能修改它。命名或任何其他类型的元组是不可变的。

我能想到的将其转换为dict的最简单方法是使用vars

>>> dict(vars(x))
{'A': 1, 'C': 3, 'B': 2}

由于someFunction返回一个iterable,您需要迭代每个元素以将所有行转换为dict s:

oDataDicts = [dict(vars(r)) for r in oData]

如果您期望1,您可以尝试提取第一个元素,但这意味着当不存在1时,会处理更多代码。

通常,调用vars会返回dict,但对于namedtuple,它似乎会返回OrderedDict。如果OrderedDict没有打扰您,您可以不再拨打dict

此外,我强烈建议您对要包含在响应中的输出更加明确。依赖HttpResponse的行为可能会让人更难记住代码应该在以后做什么。如果您想发送JSON响应,显式将其转换为JSON将是一个好主意。