The AttributeError ‘bool’ object has no attribute ‘all’ occurs when you try to call the all()
method on a Boolean. This error typically happens when comparing two lists. Suppose you are working with two lists of equal length and check for equality, for example, list1 == list2
. In that case, you will get a single Boolean value because you are only checking if both are equal and not an element-by-element comparison like with NumPy ndarrays.
You can use the equality comparison operator without using all()
to solve this error. If you want to perform an element-wise comparison, convert the lists to ndarrays using numpy.array()
. Once you have ndarrays, you can make a new ndarray by comparing the two ndarrays, for example,
comparison = array1 == array2
and then call all()
on the comparison ndarray: comparison.all()
This tutorial will go through the error in detail and how to solve it with code examples.
AttributeError: ‘bool’ object has no attribute ‘all’
AttributeError occurs in a Python program when we try to access an attribute (method or property) that does not exist for a particular object. The part of the error ‘bool’ object has no attribute ‘all’ tells us that the Boolean object we are handling does not have all()
as an attribute. The all()
method is a built-in Python method that returns True if all items in an iterable are true. Otherwise, it returns False.
NumPy also has a built-in all() method, which checks whether all array elements along a given axis evaluate to True. NumPy ndarrays also have the all() method, which returns True if all elements evaluate to True.
When we compare two lists, the result is a single Boolean, not a list of Booleans for each element comparison. We can verify this with the example below:
lst1 = [2, 4, 6, 8] lst2 = [2, 3, 5, 8] comparison = lst1 == lst2 print(comparison)
False
If we try to call all()
on the comparison variable, we call the method on a Boolean, which does not have all()
as an attribute.
Example
Let’s look at an example where we want to check if two lists are equal.
# Define lists lst = [4, 7, 12, 17, 23, 44] lst2 = [4, 3, 2, 1, 17, 44] # Check lists are equal length if len(lst) != len(lst2): print('Lists are not of equal length') else: # Check if lists are equal if (lst == lst2).all(): print('All elements are equivalent') else: print('Not all elements are equivalent')
In the above code, we check if the lists are of equal length, perform an equality comparison operation, and then call all()
on the comparison result. Let’s run the code to see the result:
--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) Input In [15], in <cell line: 9>() 11 print('Lists are not of equal length') 13 else: 14 15 # Check if lists are equal ---> 17 if (lst == lst2).all(): 19 print('All elements are equivalent') 21 else: AttributeError: 'bool' object has no attribute 'all'
The error occurs because we call the all()
method on the result of the equality comparison operation, which is a Boolean.
Solution #1: Use the Equality Operator Alone
Comparing lists is, in essence, doing what all()
does; we get a single Boolean that is True if all elements are equal between the two lists. Otherwise, False. Therefore, we do not need to use all()
if we are handling two lists. Let’s look at the revised code:
# Define lists lst = [4, 7, 12, 17, 23, 44] lst2 = [4, 3, 2, 1, 17, 44] # Check if lists are equal length if len(lst) != len(lst2): print('Lists are not of equal length') else: # Check if lists are equivalent if lst == lst2: print('All elements are equivalent') else: print('Not all elements are equivalent')
Let’s run the code to see what happens:
Not all elements are equivalent
Let’s see the result when we use two identical lists:
lst = [4, 7, 12, 17, 23, 44] lst2 = [4, 7, 12, 17, 23, 44] if len(lst) != len(lst2): print('Lists are not of equal length') else: if lst == lst2: print('All elements are equivalent') else: print('Not all elements are equivalent')
All elements are equivalent
Solution #2: Compare to NumPy arrays Using Numpy all()
If we want to make an element-wise comparison, we can use NumPy arrays instead of lists.
import numpy as np # Define two arrays arr1 = np.array([4, 7, 12, 17, 23, 44]) arr2 = np.array([4, 7, 12, 17, 23, 44]) # Check for equal length if len(arr1) != len(arr2): print('Arrays are not of equal length') else: # Comparison array comparison = (arr1 == arr2) # Call all() on array if comparison.all(): print('All elements are equivalent') else: print('Not all elements are equivalent')
In the above code, we define two NumPy arrays and check they are equal in length. Then, we use the equality comparison operator to compare the two NumPy arrays and generate a new array object. Next, we call ndarray.all()
on the new array object, which will return True if the two NumPy arrays are equivalent; otherwise, False. Let’s run the code to see the result.
All elements are equivalent
We can also pass the comparison array to the built-in NumPy all()
method or the Python all()
method. Let’s look at the revised code:
import numpy as np # Define two arrays arr1 = np.array([4, 7, 12, 17, 23, 44]) arr2 = np.array([4, 7, 12, 17, 23, 44]) # Check for equal length if len(arr1) != len(arr2): print('Arrays are not of equal length') else: # Comparison array comparison = (arr1 == arr2) # Use Numpy.all() if np.all(comparison): print('All elements are equivalent') else: print('Not all elements are equivalent')
Let’s run the code to see the result:
All elements are equivalent
import numpy as np # Define two arrays arr1 = np.array([4, 7, 12, 17, 23, 44]) arr2 = np.array([4, 7, 12, 17, 23, 44]) # Check for equal length if len(arr1) != len(arr2): print('Arrays are not of equal length') else: # Comparison array comparison = (arr1 == arr2) # Use built-in all() if all(comparison): print('All elements are equivalent') else: print('Not all elements are equivalent')
Let’s run the code to see the result:
All elements are equivalent
Using any() to Compare NumPy Arrays
Because we are comparing NumPy arrays, we can use the NumPy.ndarray.any() method to check if any elements between the two NumPy arrays are equivalent. The any()
method returns True
if any are equivalent; otherwise, it returns False
. Let’s look at the revised code:
import numpy as np # Define two arrays arr1 = np.array([4, 7, 12, 17, 23, 44]) arr2 = np.array([0, 7, 1, 2, 56, 100]) # Check for equal length if len(arr1) != len(arr2): print('Arrays are not of equal length') else: # Comparison array comparison = (arr1 == arr2) # Call any() on array if comparison.any(): print('At least one element is equivalent') else: print('None of the elements are equivalent')
Let’s run the code to see the result:
At least one element is equivalent
We can also pass the comparison array to the built-in NumPy any()
method or the Python any()
method.
Summary
Congratulations on reading to the end of this tutorial. The AttributeError: ‘bool’ object has no attribute ‘all’ can occur when trying to compare two lists and calling the all()
method on the result of the comparison. To solve this error, you can convert the list to NumPy arrays, perform the comparison to get an array of Booleans and then call the all()
method on this array. You can also pass the array to the built-in NumPy all()
method or Python all()
method.
For further reading on using any() and all(), go to the article: How to Solve Python ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Go to the online courses page on Python to learn more about coding in Python for data science and machine learning.
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.