Python ошибка "индексы списка должны быть целыми числами", они являются целыми числами - PullRequest
10 голосов
/ 21 сентября 2009

У меня проблема. У меня есть массив из 31 элементов, называемых цветами. У меня также есть другой массив с целыми числами, которые варьируются от 0 до 31, это называется c. Я хочу создать новый массив, в котором значения в c теперь соответствуют цветам.

Я пишу:

newarray = цвета [с]

но получите сообщение об ошибке «индексы списка должны быть целыми числами», но c является массивом целых чисел. Я новичок в Python, и у меня нет времени, чтобы делать учебники, так как мне просто нужно это для конкретной задачи построения. Кто-нибудь может мне помочь?

Спасибо

Ответы [ 5 ]

18 голосов
/ 21 сентября 2009

массив целых чисел! = Целое число

индексы списка должны быть целыми числами - вы дали список целых чисел.

Вы, вероятно, хотите понять список:

newarray = [ colors[i] for i in c ]

EDIT:

Если вы все еще получаете ту же ошибку, то ваше утверждение о том, что c - это список целых чисел, неверно.

Пожалуйста, попробуйте:

print type(c)
print type(c[0])
print type(colors)
print type(colors[0])

Тогда мы можем выяснить, какие типы у вас есть. Также поможет короткий, но полный пример , который, вероятно, многому научит вас по вашей проблеме.

EDIT2:

Так что, если c на самом деле представляет собой список строк, вы, вероятно, должны были упомянуть об этом, строки не конвертируются автоматически в целые числа, в отличие от некоторых других языков сценариев.

newarray = [ colors[int(i)] for i in c ]

EDIT3:

Вот минимальный код, демонстрирующий несколько исправлений ошибок:

x=["1\t2\t3","4\t5\t6","1\t2\t0","1\t2\t31"]
a=[y.split('\t')[0] for y in x]
b=[y.split('\t')[1] for y in x]
c=[y.split('\t')[2] for y in x]  # this line is probably the problem
colors=['#FFFF00']*32
newarray=[colors[int(i)] for i in c]
print newarray

a) colors должно быть длиной 32 записи. б) элементы из c (i) в понимании списка необходимо преобразовать в целые числа (int(i)).

2 голосов
/ 21 сентября 2009

Это ваш код: (из вашего комментария)

from pylab import* 
f=open("transformdata.txt") 
x=f.readlines() 
a=[y.split('\t')[0] for y in x] 
b=[y.split('\t')[1] for y in x] 
c=[y.split('\t')[2] for y in x]  # this line is probably the problem
subplot(111,projection="hammer") 
colors=['#FFFF00']*31
newarray=[colors [i] for i in c] 
p=plot([a],[b],"o",mfc=color) show()

Не зная точно, каковы ваши данные или что вы пытаетесь достичь, я бы предложил попробовать это:

c=[int(y.split('\t')[2]) for y in x] 
1 голос
/ 21 сентября 2009

Хорошо, я думаю, что знаю, что вы после ...

Итак, у вас есть список из 31 цвета. Скажем, для аргумента это список из 31 строки, как это ...

colours = [ "Black", "DarkBlue", "DarkGreen", ... "White" ]

А 'c' - это массив чисел в диапазоне от 0 до 31, но в случайном порядке ...

import random
c = [x for x in xrange(32)]
random.shuffle(c)
# 'c' now has numbers 0 to 31 in random order
# c = [ 2, 31, 0, ... 1]

И то, что вы хотите сделать, это отобразить значения в c как индекс в список цветов, чтобы в итоге вы получили список цветов в том виде, как они проиндексированы c и в этом порядке ...

mapped = [color[idx] for idx in c]
# mapped has the colors in the same order as indexed by 'c'
# mapped = ["DarkGreen", "White", "Black", ... "DarkBlue"]

Если это не то, что вы хотите, вам нужно пересмотреть свой вопрос!

Я думаю, у вас есть основная проблема в том, что в вашем списке цветов должно быть 32 элемента (цвета), а не 31, если список 'c' - это случайное перемешивание всех чисел в диапазоне от 0 до 31 (это 32 числа, вы видите).

1 голос
/ 21 сентября 2009

Python не поддерживает произвольную индексацию списка. Вы можете использовать один целочисленный индекс, например, c [4], или фрагмент, например, c [4:10]. Библиотека SciPy обладает более широкими возможностями индексирования. Или просто используйте списки в качестве советов Дугласа Лидера.

0 голосов
/ 08 мая 2017

Если цвета также integer с или float с, гораздо проще исправить с помощью Numpy:

import numpy as np
newarray = np.array(colors)[c]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...