Python 列表插入函数和数据类型问题

2 投票
1 回答
1111 浏览
提问于 2025-04-17 15:49
In [27]: run triptrade.py
This is the length of MinorTrendType the first time = 12356
This is the length of MinorTrendType after adding plustwos elements = 13179
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/usr/lib/python2.7/dist-packages/IPython/utils/py3compat.pyc in execfile(fname, *where)
    173             else:
    174                 filename = fname
--> 175             __builtin__.execfile(filename, *where)

/home/kane/tripkane_python/triptrade.py in <module>()
    579 
    580 MinorTrendArr2 = np.array(MinorTrend, dtype = np.int64)
--> 581 MinorTrendTypeArr2 = np.array(MinorTrendType, dtype = np.int64)
    582 
    583 

ValueError: setting an array element with a sequence.

我遇到了一个问题,我觉得问题的原因和插入函数的特性有关。文档上说插入的工作方式是这样的:

list.insert(index, object)

这里的关键点是“对象”。为了进行一个能处理值的if语句,我把原来的列表转换成了一个数组。这个数组的数据类型是由Python自动计算出来的,结果是:

In [25]: MinorTrendTypeArr.dtype
Out[25]: dtype('int64')

但是在我把需要的项目插入到列表后,

MinorTrendType

新的数组,

MinorTrendTypeArr2

正如之前提到的,这一定是因为插入函数在将对象项添加到列表时的处理方式。它的数据类型是

In [25]: MinorTrendTypeArr2.dtype
Out[25]: dtype('object')

这进一步证明了当我尝试把这个变量转换成新的数组时,出现了以下错误。

MinorTrendType

但是在没有输入外部值的变量中,并没有出现同样的问题。我想可能有更好的方法来解决这个问题,但我目前只能用我非常有限的知识来继续。如果有任何帮助或替代方案的建议,我将非常感激。注意:我不能在一个循环中输入所有需要的值,因为输入项目会改变列表的长度,除非有更简单的解决办法。

提前谢谢你,

Kane

for n in range(0, len(MinorTrendType)):

    if MinorTrendTypeArr[n] == 2:
        plustwos.append(n)

pl = []
mi = []

PS1 = len(MinorTrendType)
print "This is the length of MinorTrendType the first time = %d" %PS1

for n in range(0, len(plustwos)):
    bbgun = plustwos[n] + len(plustwos[0:n])
    pl.append(bbgun)
    MinorTrendType.insert(pl[n], 22)
    MinorTrend.insert(pl[n], MinorTrend[pl[n]])


PS2 = len(MinorTrendType)
print "This is the length of MinorTrendType after adding plustwos elements = %d" %PS2

MinorTrendArr2 = np.array(MinorTrend, dtype = np.int64)
MinorTrendTypeArr2 = np.array(MinorTrendType, dtype = np.int64)

更新/编辑:

MinorTrendType

是一个整数列表,像这样: MinorTrendType = [1,0,-1,1,0,-1,2,-1,1,-1,0,0,0,2,1,0,0,-1,2,1,0,-2............]

MinorTrend

是一个索引列表,表示 MinorTrendType 中存在的值(这些值满足某些条件)。我想要做的就是在 MinorTrendType 中每次出现2和-2的地方插入标记,并在 MinorTrend 中相应的位置重复索引值。我尝试在循环中使用 map(i, x) int(MinorTrendType[n]) 以及列表和列表推导,但都没有成功。我希望这样能让事情更清楚。我不在乎怎么做,只想实现这个目标 :)

1 个回答

0

太好了!问题的解决在于 MinorTrendArr2.dtype = 'object' 而不是我之前猜测的 'int64'。解决办法在于下面这个循环:

for n in range(0, len(plustwos)):
bbgun = plustwos[n] + len(plustwos[0:n])
pl.append(bbgun)
MinorTrendType.insert(pl[n], 22)
MinorTrend.insert(pl[n], MinorTrend[pl[n]])

应该这样写:

for n in range(0, len(plustwos)):
bbgun = plustwos[n] + len(plustwos[0:n])
pl.append(bbgun)
MinorTrendType.insert(pl[n], [22])
MinorTrend.insert(pl[n], MinorTrend[pl[n]])

唯一的区别是,插入到列表中的对象周围有 [ ]。这样,Python就会把数组 MinorTrendArr2 当作 'int64' 而不是对象,从而正确计算下一个if语句的结果 :)

干杯!

撰写回答