Ошибка «Объект ‘int’ не поддается подписке», хотя объект является списком

#python

#python

Вопрос:

У меня есть список с именем chromosome , который содержит 40 записей. Каждая запись представляет собой двоичное число. Например,

chromosome = [1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1]

Мне нужно преобразовать каждые четыре двоичных файла в целое число. Например, список целых чисел будет

intlist = [12, 6 ... ]

поскольку 1100b = 12 и так далее.

Чтобы решить проблему, я написал следующую функцию Python

 def makeChromosomeInteger(chromosome, chrom_size):
    intstring = [0] * 10
    i = 0
    for j in range(0, 40, 4):
        intstring[i] = str(chromosome[j])   str(chromosome[j 1])   str(chromosome[j 2])   str(chromosome[j 3])
        intstring[i] = int(intstring[i],2)
        i = i 1

    return intstring
  

Это работает в большинстве случаев — функция действительно преобразует каждые четыре двоичных файла в целые числа. Однако рано или поздно я получаю следующее сообщение об ошибке:

 builtins.TypeError: 'int' object is not subscriptable
  

и проблема, похоже, в intstring[i] = int(intstring[i],2) . Я действительно понятия не имею, почему это происходит. Ни intstring , ни chromosome не является целым числом, так почему я не могу адресовать эти списки?

Заранее спасибо!

PS: Если есть какие-либо другие умные способы преобразования этих записей, я открыт для предложений 🙂

Комментарии:

1. С показанным вами кодом проблем нет.

2. Вы говорите, что функция в основном работает, но рано или поздно возникает ошибка. Это подразумевает, что ошибка связана не с самой функцией, а с кодом, который вызывает функцию. Вы уверены, что нет ошибки, и в итоге передается int, а не list? Используйте блок try / catch и выведите аргументы вашей функции после TypeError.

Ответ №1:

Ваш код должен работать, но вот упрощение:

 chromosome = [1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0,
              0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0,
              1, 0, 0, 1, 0, 0, 1, 1]

def makeIntList(chrom):
    intlist = []
    for j in range(0, len(chrom), 4):
        intlist.append(chrom[j]*8   chrom[j 1]*4   chrom[j 2]*2   chrom[j 3])
    return intlist

intlist = makeIntList(chromosome)
print(intlist)
  

Комментарии:

1. Большое вам спасибо за упрощение и за проверку моего кода. Вы правы, мой код верен. Это была какая-то другая функция, вызывающая проблемы.

Ответ №2:

вместо этого попробуйте следующее для вашего кода:

 cs = [str(i) for i in chromosome]        # Convert to strings
grp = [cs[i:i 4] for i in range(0,len(cs),4)] # Group into fours
ints = [int(''.join(g),2) for g in grp] # concatenate and convert as base 2.
  

Результат для вашего примера [12, 6, 14, 0, 7, 8, 5, 0, 9, 3] .