在Python迭代器中添加另一个元素
oCopy = ( i for i in oData )
我在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__()
方法的定义。
我想要的答案可能涉及以某种方式克隆它的数据,这样我就可以往里面添加内容。
我尝试过这样做,但没有成功。
在PHP中,我只需收集键值对并将它们存储到一个关联数组中。
2 个回答
根据你在另一个回答中的评论,我猜 oData
是一系列的 namedtuple
,而 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
这就解释了为什么你不能修改它。元组(无论是普通元组还是命名元组)都是不可变的。
我想到的最简单的方法是使用 vars
来把它转换成 dict
:
>>> dict(vars(x))
{'A': 1, 'C': 3, 'B': 2}
因为 someFunction
返回的是一个可迭代的对象,你需要遍历每个元素,把所有的行都转换成 dict
:
oDataDicts = [dict(vars(r)) for r in oData]
如果你只期待一个元素,可以尝试提取第一个元素,但这样的话就需要写更多的代码来处理当没有一个元素的情况。
通常情况下,调用 vars
会返回一个 dict
,但对于 namedtuple
来说,它似乎返回的是一个 OrderedDict
。如果 OrderedDict
对你来说没问题,你可以省略额外调用 dict
的步骤。
另外,我强烈建议你在响应中更明确地说明你想要的输出。依赖 HttpResponse
的行为可能会让你以后更难记住这段代码的作用。如果你想发送一个 JSON 响应,明确地把它转换成 JSON 会是个好主意。