In Python, you cannot access values inside a float using indexing syntax. Floating-point numbers are single values, and indexing syntax is only suitable for subscriptable objects such as strings or lists. If you attempt to retrieve an individual number from a float, you will raise the “TypeError: ‘float’ object is not subscriptable”.
This tutorial will go through what the error means and the possible causes. We will explore examples and provide solutions for each of them.
Table of contents
TypeError: ‘float’ object is not subscriptable
Let’s break up the error message to understand what the error means. TypeError occurs whenever you attempt to use an illegal operation for a specific data type. The part “float object” tells us the error concerns an illegal operation for floating-point numbers.
The part “is not subscriptable” tells us we cannot access an element of the float
object.
You cannot retrieve a specific value from a float
. Floating-point numbers are not subscriptable objects.
Possible causes of “TypeError: ‘float’ object is not subscriptable” are:
- Trying to access an item from a float
- Trying to replace multiple items in a list
A subscriptable object is a container for other objects and implements the __getitem__()
method. Examples of subscriptable objects include strings, lists, tuples, and dictionaries.
We can check if an object implements the __getitem__()
method by listing its attributes with the dir
function. Let’s call the dir function and pass a float and a string to see their attributes.
num = 5.1 print(dir(num))
['__abs__', '__add__', '__bool__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getformat__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__int__', '__le__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__pos__', '__pow__', '__radd__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rmod__', '__rmul__', '__round__', '__rpow__', '__rsub__', '__rtruediv__', '__set_format__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', 'as_integer_ratio', 'conjugate', 'fromhex', 'hex', 'imag', 'is_integer', 'real']
string = "Python" print(dir(string))
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
If you want to check if a specific attribute belongs to an object, you can check for membership using the in
operator.
num = 5.1 print('__getitem__' in dir(num))
False
We can see that __getitem__
is not an attribute of the Float data type.
string = "Python" print('__getitem__' in dir(string))
True
We can see that __getitem__
is an attribute of the String data type.
Example #1: Accessing an Item from a Float
You may encounter this error when using the indexing operation on float numbers, such as extracting the first or last digit from a floating-point number. Let’s look at an example of defining a floating-point number a try to access the first digit:
# floating point number float_number = 456.0 # Access first digit of the floating number using indexing first_digit = float_number[0] # Print output print(first_digit)
Let’s run the code to see what happens:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) first_digit = float_number[0] TypeError: 'float' object is not subscriptable
The Python interpreter raises the TypeError because we are trying to access an element in a floating-point number.
Solution
We need to change the floating-point number to a subscriptable type to solve the problem. We will typecast the floating-point number to a string using the str()
function. Once we have a string, we can access the first digit using indexing. Then we can convert the first digit string to an integer using the int()
function.
# floating point number float_number = 456.0 # Convert float to string string_number = str(float_number) # Access the first digit using indexing first_digit = string_number[0] # Convert first digit string value to integer first_digit = int(first_digit) # Print the first digit to console print(f'The first digit of {float_number} is: {first_digit}')
Let’s run the code to get the result:
The first digit of 456.0 is: 4
Example #2: Replacing Multiple Items in a List
Slicing involves specifying a list of items in an object that you want to access or change. We can use list slicing to replace multiple items in a list. Let’s look at an example of a program that changes the weights of apples in grams to a particular weight. The first part of the program takes an input from the user asking for the default weight of an apple:
weight = input("Enter the default weight for an apple: ")
We can then define a list of apple weights we need to change
apples = [96.3, 103.5, 74.5, 84.0, 90.2]
We can try to change the values in the list using indexing:
apples[0][1][2][3][4] = [float(weight)]*5
print(apples)
The above code resets the weights of the apples in the list at all index positions to the value of weight
, a floating-point number. The weight is enclosed in square brackets and multiplied by five. This operation assigns five values to the five index positions in the apples
list.
Let’s see what happens when we run the program:
Enter the default weight for an apple: 80
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) apples[0][1][2][3][4] = [float(weight)]*5 TypeError: 'float' object is not subscriptable
The Python interpreter raises the TypeError because the list only contains floats. Therefore, when we access the first element of the list with apples[0]
we get a float
. It follows that apples[0][1]
is equivalent to accessing the element at the index position 1
in a float
.
Solution
We can use the slicing syntax to update the list to solve this error.
weight = input("Enter the default weight for an apple: ") apples = [96.3, 103.5, 74.5, 84.0, 90.2] apples[:4] = [float(weight)]*5 print(apples)
Enter the default weight for an apple: 80 [80.0, 80.0, 80.0, 80.0, 80.0]
The code retrieves all the items in the list from the index position 0 to 4 and assigns each value with the input value of weight
. Go to the “How to Get a Substring From a String in Python” post to learn more about slicing.
Summary
Congratulations on reading to the end of this tutorial. The error “TypeError: ‘float’ object is not subscriptable” occurs when you try to access a floating-point number like a list. To solve this error, ensure you only use indexing or slicing syntax on a subscriptable object, like a list or a string. If you need to change multiple values in a list, ensure you use slicing instead of specifying a list of index numbers.
For further reading on TypeErrors, go to the articles:
- How to Solve Python TypeError: ‘str’ object does not support item assignment
- How to Solve Python TypeError: ‘set’ object is not subscriptable
- How to Solve Python TypeError: ‘_io.TextIOWrapper’ object is not subscriptable
- How to Solve Python TypeError: ‘dict_items’ object is not subscriptable
To learn more about Python for data science and machine learning, you can go to the online courses page on Python for the most comprehensive courses.
Have fun and happy researching!
Suf is a senior advisor in data science with deep expertise in Natural Language Processing, Complex Networks, and Anomaly Detection. Formerly a postdoctoral research fellow, he applied advanced physics techniques to tackle real-world, data-heavy industry challenges. Before that, he was a particle physicist at the ATLAS Experiment of the Large Hadron Collider. Now, he’s focused on bringing more fun and curiosity to the world of science and research online.