#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]
.