2013-02-13 4 views
2

У меня возникла проблема, и я считаю, что причина связана с характером функции вставки. В документации сказано, что вставка работает следующим образом:Функция ввода списка списков Python и проблема с типом данных

list.insert(index, object) 

Ключевым моментом здесь является «объект». Чтобы вести оператор if, который работает с значениями, я преобразовал исходный список в массив. Данные типа этого массива автоматически вычисляется питоном быть следующим:

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

Однако после установки необходимых элементов в списке

MinorTrendType 

новый массив,

MinorTrendTypeArr2 

Как упоминалось ранее, это должно быть связано с тем, что метод добавления функции добавления элементов объекта в список. имеет тип данных

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

Это дополнительно подтверждается получение следующее сообщение об ошибке при попытке преобразовать переменную в

MinorTrendType 

в новый массив.

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. 

Но та же проблема не возникает в переменной, в которой не было введенных внешних значений. Я предполагаю, что есть, вероятно, лучший способ сделать что-то, но я использую свои очень ограниченные знания в настоящий момент для прогресса. Любая помощь, предложения альтернатив были бы очень желанными. Примечание. Я не могу ввести все обязательные значения в один цикл, так как ввод элементов изменяет длину списка, если не указано, что есть более легкая работа.

Спасибо заранее,

Кейн

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) 

UPDATE/EDIT:

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 существуют (они просто удовлетворяют определенным условиям). Все, что я хочу добиться того, чтобы вставить маркера на каждое вхождении 2 и -2 значение в MinorTrendType и дублирует значение индекса на correpsonding сайтов в MinorTrend Я попытался с помощью карты (I, х) Int (MinorTrendType [ n]) в пределах цикла, списка и списков без успеха. Надеюсь, это упростит ситуацию. Мне все равно, как это делается, просто хочу этого достичь :)

+0

я была совсем немного трудностей, следующих за этим. Несколько основных вопросов. 1. «Чтобы выполнить оператор if, который работает с значениями, я преобразовал исходный список в массив». - Было ли это более эффективным? Операторы Python If обрабатывают любой тип данных просто отлично (включая числовые значения). Если это все, что вам нужно, вам не нужно numpy. 2. Почему вы заботитесь о типе данных для данных? Python предназначен для утиного ввода (т. Е. Вы не заботитесь о типе, просто о функциональности). – Namey

+0

Кроме того, я должен отметить, что в Python все является «объектом» для всех целей и целей. Любая функция, которая принимает «объект», может принимать ЛЮБЫЕ типы данных. – Namey

+0

@Namey Спасибо за ваши запросы: 1) То, что я подразумеваю под этим утверждением, - это когда я преобразовал список в массив, так что оператор if распознает, что любое из значений в массиве - это числа (в этом случае целые числа). Когда я выполняю оператор if со списком, он не работает. 2) Я не даю крысам о типе данных, я просто хочу, чтобы 2-ое заявление работало. Я расскажу вам подробнее о редактировании/обновлении исходной проблемы. Надеюсь, это немного улучшит ситуацию. Если это не обновление, Cheers – tripkane

ответ

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]]) 

лишь разницей, что объект вставляется в список есть [] вокруг него. Затем питона принимает массив со MinorTrendArr2 быть «int64» вместо объекта и позволяет для правильного вычисления следующего, если заявление :)

Приветствий

Смежные вопросы