在Python迭代器中添加另一个元素

-2 投票
2 回答
1057 浏览
提问于 2025-04-17 18:21
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 个回答

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 会是个好主意。

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' }

撰写回答