Почему в моем коде i не считается целым числом? - PullRequest
0 голосов
/ 16 июня 2020

Я новичок в Python, и я пытаюсь написать функцию, которая возвращает количество единиц в двоичном числе (т.е. если на входе 12, то он должен вернуть 2, так как 12 - это 1100 в двоичном формате. Однако я продолжаю получение ошибки «TypeError: индексы списка должны быть целыми числами, а не str», и я не знаю, что не так, я искал проблему, но не понял, что означают ответы.

Вот код (я знаю это может быть короче Я просто задаю вопрос, потому что часто получаю эту ошибку и не знаю, почему она возникает):

def count_ones(num):
x=0
for i in bin(num):
    if list(bin(num))[i] ==1:
        x += 1
return x

Ответы [ 3 ]

3 голосов
/ 16 июня 2020

Просто, bin(x) возвращает строку, представляющую двоичное число, как указывают документы .

Итак, for i in bin(num): выполняет итерацию по символам в этой строке.

Вы можете добиться того, чего хотите, проверив вместо этого i == '1', так что ваш код будет

def count_ones(num):
    x=0
    for i in bin(num):
        if i == '1':
            x += 1
    return x

Однако рассмотрите возможность упрощения вашей функции, используя метод count для подсчета вхождений '1' в двоичном представлении следующим образом:

def count_ones(num):
    return bin(num).count('1')
1 голос
/ 16 июня 2020

Я бы просто использовал для этого выражение генератора.

def count_ones(num):
    return sum(1 for digit in bin(num) if digit == '1')

Пример

>>> count_ones(50)
3
>>> bin(50)
'0b110010'

Как бы то ни было, ваш код не работает, потому что bin возвращает строка, поэтому каждый элемент, над которым вы l oop, будет иметь тип str, а не int.

1 голос
/ 16 июня 2020

bin возвращает строку, в которой вы повторяете каждый бит как строку. Вы должны использовать int(i). Вероятно, вам следует использовать format или str.format, чтобы удалить префикс 0b, поскольку b не является целым числом.

for i in format(num, 'b'):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...