2013-03-01 2 views
0

Почему он не распечатывает позицию целого числа/float, пока я не преобразую его в строку? Пример Зачем мне преобразовывать числа в строки, чтобы получить его местоположение?

x = 123 
print x[0] # error 

Чтобы исправить это, я должен сделать

x = 123 
print str(x)[0] 

Но почему я должен сделать это в строку для того, чтобы работать?

+5

Поскольку вы используете доступ пункта по типу, что Безразлично» t поддерживать его? Что вы ожидаете от 'x [0]' to * do *? Строки - это последовательности, цифры - нет. Или, по-другому, что означает «получить свое местоположение» *? –

+0

Я пытаюсь найти первую цифру x и распечатать только это число. –

+0

Тогда 123 - это * одно представление * целочисленного значения. Перевернув его в строку, вы «захватите» представление в ряд цифр, и тогда вы сможете получить первый. –

ответ

4

Ну, зачем эта работа в первую очередь? Что такое n-й индекс числа; что такое индекс 0 десятичного числа 123?

  • Это 1 из-за его десятичного представления?
  • Это 7 из-за его шестнадцатеричного представления (7B)?
  • Это 0 из-за его шестнадцатеричного представления (0x7B)?
  • Это 1 из-за его восьмеричного представления (173)?
  • Это 0 из-за его восьмеричного представления (0173)?
  • Это 1 из-за его двоичном представлении (1111011)
  • Это 1 из-за его двоичное представление с наименьшего значащего бита первого (1101111)?
  • Это S, потому что это то, что 123 находится в ASCII?
  • ...

Как вы можете видеть, это очень неясно, и это не имеет смысла, чтобы начать с. При использовании доступа индекса в списке вы получаете n-й элемент списка. Когда вы используете индексный доступ в последовательности, вы получаете n-й элемент последовательности. Строка представляет собой последовательность символов, поэтому при использовании доступа индекса к строке вы получаете n-й элемент последовательности строк; n-й символ. Число не является последовательностью, только его строковое представление в некотором формате.

+0

Спасибо, все имеет смысл сейчас –

1

Простой ответ потому, что у вас неправильный тип. Целые числа не поддерживают индексирование - и я действительно не думаю, что они должны (они не являются последовательностями или сопоставлениями, и я не могу думать о том, что индексирование целого действительно имеет смысл).

Обратите внимание, что есть более чем один способ представляет собой целое число, а также:

>>> 0x7b == 123 
True 

Таким образом, в этом случае, кто должен сказать, что x[0] должен возвращать 1 вместо 0 (или 7), в зависимости от того, как вы хотите об этом подумать?

+0

Спасибо, я понял! –

3

123 есть только одно представление целочисленного значения. Значения Python int не являются последовательностями или сопоставлениями, поэтому индексирование [item] не имеет для них значения.

Поворачивая число в строку, вы «захватываете» представление в виде ряда цифр, и тогда вы можете получить первый.

Другой способ сделать это было бы разделить на 10 до тех пор, пока есть несколько ниже, чем 10:

x = 123 
while x > 10: 
    x //= 10 

print x # prints the number 1 

Обратите внимание, что x затем держит int еще, а не строка односимвольный.

0

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

In [2]: map(int,str(123)) 
Out[2]: [1, 2, 3] 

In [3]: map(int,str(123))[0] 
Out[3]: 1 

In [4]: type(map(int,str(123))[0]) 
Out[4]: int