**How Do I Compare Two Lists In Python Using For Loop?**

Comparing two lists in Python is a common task in programming, especially when dealing with data manipulation and analysis. This article by COMPARE.EDU.VN explores various methods to achieve this, focusing on using the for loop for a clear and controlled comparison. Whether you’re checking for identical elements, finding differences, or verifying the presence of specific items, understanding these techniques is crucial for efficient Python development. Learn the intricacies of list comparison and discover how compare.edu.vn can further assist you in making informed decisions. Dive in to explore list comprehension, conditional statements, and element-wise comparison.

1. Why Compare Two Lists in Python?

Comparing two lists in Python is crucial for a multitude of reasons, serving as a fundamental operation in various programming scenarios. Here’s a breakdown of why it’s so important:

  • Data Validation: Ensures the integrity of data by verifying if two lists contain the same elements, which is vital in applications processing sensitive information.
  • Change Detection: Identifies changes between two versions of a list, useful in version control systems and configuration management.
  • Algorithm Testing: Confirms the correctness of algorithms by comparing expected and actual outputs, which is fundamental in software development.
  • Searching and Filtering: Locates specific items or differences in datasets, enabling more efficient data processing and analysis.
  • Eliminating Redundancy: Removes duplicate entries across multiple lists, streamlining data management and reducing errors.
  • Performance Improvement: Compares the efficiency of different list operations, which helps in optimizing code for faster execution.
  • Machine Learning: Validates data transformations and feature engineering, which is essential for training accurate models.
  • Web Development: Manages and compares user inputs, configuration settings, and session data, which enhances web application functionality and security.
  • Database Operations: Checks data consistency between database records, guaranteeing data quality and reliability.
  • Configuration Management: Verifies system settings and configurations, ensuring that systems are set up correctly and securely.

The ability to compare lists efficiently opens up numerous possibilities for problem-solving and optimization in Python programming.

2. Understanding Lists in Python

Lists in Python are versatile, ordered, and mutable data structures used to store collections of items. Key characteristics include:

  • Ordered: Elements in a list maintain a specific order, allowing access via index.
  • Mutable: Lists can be modified after creation, enabling the addition, removal, or alteration of elements.
  • Heterogeneous: Lists can contain elements of different data types, such as integers, strings, and even other lists.
  • Dynamic Size: Lists can grow or shrink dynamically, adapting to the number of elements they contain.
  • Duplicates Allowed: Lists can store multiple occurrences of the same element.
  • Indexing: Elements are accessed using integer indices, starting from 0. Negative indexing is also supported to access elements from the end of the list.
  • Slicing: Subsets of lists can be extracted using slicing, providing a convenient way to work with portions of a list.
  • Methods: Lists come with a variety of built-in methods for common operations, such as appending, inserting, removing, and sorting elements.
  • List Comprehension: Provides a concise way to create new lists based on existing ones, often used for filtering and transforming data.

Understanding these characteristics is crucial for effectively using lists in Python programming.

3. Different Ways to Compare Lists in Python

Python offers various methods to compare lists, each with its own advantages and use cases. Here’s an overview:

  • Using the == Operator:
    • Compares the contents of two lists element-wise.
    • Returns True if both lists have the same elements in the same order, otherwise False.
    • Simplest and most common method for basic list comparison.
  • Using the for Loop:
    • Iterates through each element of both lists to compare them individually.
    • Provides fine-grained control over the comparison process.
    • Useful for custom comparison logic or when needing to identify differences.
  • Using the sort() Method or the sorted() Function:
    • Sorts the lists before comparing them to disregard the original order.
    • sort() modifies the list in-place, while sorted() returns a new sorted list.
    • Suitable for comparing lists where the order of elements is not important.
  • Using the set() Function:
    • Converts lists to sets, which are unordered collections of unique elements.
    • Compares the sets to determine if they contain the same elements, regardless of order.
    • Useful for identifying if two lists have the same unique elements.
  • Using the collections.Counter() Class:
    • Counts the frequency of each element in the lists.
    • Compares the counts to determine if the lists have the same elements with the same frequencies.
    • Useful for comparing lists where element order and frequency matter.
  • Using List Comprehension:
    • Creates a new list containing the differences between the two lists.
    • If the resulting list is empty, the original lists are identical.
    • Useful for identifying and extracting differences between lists.
  • Using the reduce() and map() Functions:
    • Applies a comparison function to each element of the lists using map().
    • Reduces the results to a single boolean value using reduce().
    • Useful for complex comparison logic and custom conditions.

Each method provides a unique approach to list comparison, allowing you to choose the best one based on your specific needs and requirements.

4. Comparing Lists Using a For Loop

4.1. Basic Comparison

The most straightforward way to compare two lists using a for loop involves iterating through the lists and checking if each element at the corresponding index is equal.

Code Example:

def compare_lists(list1, list2):
    if len(list1) != len(list2):
        return False
    for i in range(len(list1)):
        if list1[i] != list2[i]:
            return False
    return True

list_a = [1, 2, 3, 4, 5]
list_b = [1, 2, 3, 4, 5]
list_c = [1, 2, 3, 4, 6]

print(f"List A and List B are the same: {compare_lists(list_a, list_b)}")
print(f"List A and List C are the same: {compare_lists(list_a, list_c)}")

Explanation:

  1. Length Check: The function first checks if the lengths of the two lists are equal. If they are not, the lists cannot be the same, and the function immediately returns False.
  2. Element-wise Comparison: The for loop iterates through each index of the lists. Inside the loop, it compares the elements at the current index in both lists.
  3. Early Exit: If any pair of elements at the same index are not equal, the function immediately returns False.
  4. Equality: If the loop completes without finding any unequal elements, the function returns True, indicating that the lists are the same.

Advantages:

  • Simplicity: Easy to understand and implement.
  • Control: Provides explicit control over the comparison process.

Disadvantages:

  • Verbosity: Requires more code compared to other methods.
  • Performance: Can be slower for large lists due to the explicit loop.

4.2. Handling Different Data Types

When comparing lists with mixed data types, it’s essential to ensure that the comparison logic can handle different types appropriately.

Code Example:

def compare_lists_mixed_types(list1, list2):
    if len(list1) != len(list2):
        return False
    for i in range(len(list1)):
        if type(list1[i]) != type(list2[i]):
            return False
        if list1[i] != list2[i]:
            return False
    return True

list_a = [1, 'hello', 3.14, True]
list_b = [1, 'hello', 3.14, True]
list_c = [1, 'world', 2.71, False]

print(f"List A and List B are the same: {compare_lists_mixed_types(list_a, list_b)}")
print(f"List A and List C are the same: {compare_lists_mixed_types(list_a, list_c)}")

Explanation:

  1. Type Check: Before comparing the values, the function checks if the data types of the elements at the current index are the same. If they are not, the function returns False.
  2. Value Comparison: If the data types are the same, the function compares the values of the elements.

Advantages:

  • Type Safety: Avoids errors due to comparing incompatible types.
  • Robustness: Handles lists with mixed data types correctly.

Disadvantages:

  • Complexity: Adds additional checks, increasing the code’s complexity.
  • Performance: Can be slower due to the additional type checking.

4.3. Ignoring Order

Sometimes, you may need to compare lists while ignoring the order of elements. This can be achieved by sorting the lists before comparison.

Code Example:

def compare_lists_ignore_order(list1, list2):
    if len(list1) != len(list2):
        return False
    sorted_list1 = sorted(list1)
    sorted_list2 = sorted(list2)
    for i in range(len(sorted_list1)):
        if sorted_list1[i] != sorted_list2[i]:
            return False
    return True

list_a = [1, 2, 3, 4, 5]
list_b = [5, 4, 3, 2, 1]
list_c = [1, 2, 3, 4, 6]

print(f"List A and List B are the same: {compare_lists_ignore_order(list_a, list_b)}")
print(f"List A and List C are the same: {compare_lists_ignore_order(list_a, list_c)}")

Explanation:

  1. Sorting: The function sorts both lists using the sorted() function, which returns new sorted lists without modifying the original lists.
  2. Element-wise Comparison: The for loop iterates through the sorted lists and compares the elements at each index.

Advantages:

  • Order Insensitivity: Compares lists regardless of the order of elements.
  • Readability: Clear and easy to understand.

Disadvantages:

  • Performance: Sorting adds overhead, making it less efficient for very large lists.
  • Memory: Requires additional memory to store the sorted lists.

4.4. Finding Differences

To identify the differences between two lists, you can modify the for loop to collect the elements that are not the same.

Code Example:

def find_differences(list1, list2):
    differences = []
    if len(list1) != len(list2):
        return "Lists have different lengths"
    for i in range(len(list1)):
        if list1[i] != list2[i]:
            differences.append((list1[i], list2[i]))
    return differences

list_a = [1, 2, 3, 4, 5]
list_b = [1, 2, 3, 7, 5]

print(f"Differences between List A and List B: {find_differences(list_a, list_b)}")

Explanation:

  1. Collect Differences: The function initializes an empty list called differences.
  2. Comparison: The for loop iterates through the lists, and if the elements at the current index are not equal, it appends a tuple containing both elements to the differences list.
  3. Return Differences: The function returns the differences list, which contains all the pairs of unequal elements.

Advantages:

  • Detailed Information: Provides specific information about the differences between the lists.
  • Flexibility: Can be easily modified to include additional information, such as the index of the differences.

Disadvantages:

  • Complexity: Requires additional logic to collect and store the differences.
  • Verbosity: The code is more verbose compared to simple equality checks.

4.5. Using zip() for Parallel Iteration

The zip() function can be used to iterate through two lists in parallel, making the code more concise and readable.

Code Example:

def compare_lists_zip(list1, list2):
    if len(list1) != len(list2):
        return False
    for elem1, elem2 in zip(list1, list2):
        if elem1 != elem2:
            return False
    return True

list_a = [1, 2, 3, 4, 5]
list_b = [1, 2, 3, 4, 5]
list_c = [1, 2, 3, 4, 6]

print(f"List A and List B are the same: {compare_lists_zip(list_a, list_b)}")
print(f"List A and List C are the same: {compare_lists_zip(list_a, list_c)}")

Explanation:

  1. Parallel Iteration: The zip() function combines the two lists into a single iterable, where each element is a tuple containing the corresponding elements from both lists.
  2. Comparison: The for loop iterates through the zipped list, unpacking each tuple into elem1 and elem2, which are then compared.

Advantages:

  • Conciseness: More readable and compact compared to using index-based iteration.
  • Efficiency: Can be more efficient in some cases, as it avoids explicit index manipulation.

Disadvantages:

  • Readability: Requires understanding of the zip() function.

4.6. Optimizing Performance

For very large lists, performance can become a concern. Here are some tips to optimize the comparison process:

  • Early Exit: Always check the lengths of the lists first and exit early if they are not equal.
  • Use zip(): The zip() function can be more efficient than index-based iteration in some cases.
  • Avoid Unnecessary Operations: Minimize the number of operations inside the loop.
  • Consider NumPy: For numerical data, consider using NumPy arrays and vectorized operations, which can be significantly faster than Python lists.

Code Example (NumPy):

import numpy as np

def compare_lists_numpy(list1, list2):
    array1 = np.array(list1)
    array2 = np.array(list2)
    return np.array_equal(array1, array2)

list_a = [1, 2, 3, 4, 5]
list_b = [1, 2, 3, 4, 5]
list_c = [1, 2, 3, 4, 6]

print(f"List A and List B are the same: {compare_lists_numpy(list_a, list_b)}")
print(f"List A and List C are the same: {compare_lists_numpy(list_a, list_c)}")

Explanation:

  1. Convert to NumPy Arrays: The lists are converted to NumPy arrays using np.array().
  2. Array Comparison: The np.array_equal() function compares the arrays element-wise and returns True if they are equal, otherwise False.

Advantages:

  • Performance: NumPy arrays and vectorized operations are highly optimized for numerical data.
  • Conciseness: The code is very compact and readable.

Disadvantages:

  • Dependency: Requires the NumPy library.
  • Type Restriction: Best suited for numerical data; may not be appropriate for lists with mixed data types.

5. Comparing Lists Using Other Methods

5.1. Using the == Operator

The == operator provides a simple and direct way to compare two lists.

Code Example:

list_a = [1, 2, 3, 4, 5]
list_b = [1, 2, 3, 4, 5]
list_c = [1, 2, 3, 4, 6]

print(f"List A and List B are the same: {list_a == list_b}")
print(f"List A and List C are the same: {list_a == list_c}")

Advantages:

  • Simplicity: The simplest and most readable way to compare lists.
  • Efficiency: Generally efficient for most use cases.

Disadvantages:

  • Order Matters: Requires the lists to have the same elements in the same order.

5.2. Using the sort() Method or the sorted() Function

Sorting lists before comparison allows you to ignore the original order of elements.

Code Example:

list_a = [1, 2, 3, 4, 5]
list_b = [5, 4, 3, 2, 1]
list_c = [1, 2, 3, 4, 6]

sorted_a = sorted(list_a)
sorted_b = sorted(list_b)
sorted_c = sorted(list_c)

print(f"List A and List B are the same: {sorted_a == sorted_b}")
print(f"List A and List C are the same: {sorted_a == sorted_c}")

Advantages:

  • Order Insensitivity: Compares lists regardless of the order of elements.

Disadvantages:

  • Performance: Sorting adds overhead.

5.3. Using the set() Function

Converting lists to sets allows you to compare them based on their unique elements, ignoring order and duplicates.

Code Example:

list_a = [1, 2, 3, 4, 5]
list_b = [5, 4, 3, 2, 1]
list_c = [1, 2, 3, 4, 6]

set_a = set(list_a)
set_b = set(list_b)
set_c = set(list_c)

print(f"List A and List B are the same: {set_a == set_b}")
print(f"List A and List C are the same: {set_a == set_c}")

Advantages:

  • Order and Duplicate Insensitivity: Compares lists regardless of order and duplicates.

Disadvantages:

  • Ignores Duplicates: Treats multiple occurrences of the same element as a single element.

5.4. Using the collections.Counter() Class

The Counter class allows you to compare lists based on the frequency of their elements.

Code Example:

from collections import Counter

list_a = [1, 2, 3, 4, 5]
list_b = [5, 4, 3, 2, 1]
list_c = [1, 2, 3, 4, 6]

counter_a = Counter(list_a)
counter_b = Counter(list_b)
counter_c = Counter(list_c)

print(f"List A and List B are the same: {counter_a == counter_b}")
print(f"List A and List C are the same: {counter_a == counter_c}")

Advantages:

  • Frequency Comparison: Compares lists based on the frequency of elements.

Disadvantages:

  • Order Insensitive: Ignores the order of elements.

5.5. Using List Comprehension

List comprehension can be used to identify differences between lists.

Code Example:

list_a = [1, 2, 3, 4, 5]
list_b = [1, 2, 3, 7, 5]

differences = [x for x in list_a + list_b if x not in list_a or x not in list_b]
print(f"Differences between List A and List B: {differences}")

Advantages:

  • Conciseness: Provides a compact way to find differences.

Disadvantages:

  • Complexity: Can be less readable for complex comparisons.

6. Practical Applications of List Comparison

6.1. Data Validation

Ensuring that data matches expected values is a critical aspect of software development. List comparison is often used to validate data in various scenarios:

  • Input Validation: Verifying that user input matches a predefined list of valid options.
  • Configuration Validation: Ensuring that configuration settings are consistent with expected values.
  • Database Validation: Confirming that data retrieved from a database matches expected results.

Code Example:

def validate_input(user_input, valid_options):
    if user_input in valid_options:
        return True
    else:
        return False

valid_options = ['yes', 'no', 'maybe']
user_input = 'yes'

if validate_input(user_input, valid_options):
    print("Valid input")
else:
    print("Invalid input")

6.2. Change Detection

Identifying changes between two versions of a list is useful in version control systems and configuration management.

Code Example:

def detect_changes(old_list, new_list):
    added = [x for x in new_list if x not in old_list]
    removed = [x for x in old_list if x not in new_list]
    return added, removed

old_list = [1, 2, 3, 4, 5]
new_list = [1, 2, 3, 6, 7]

added, removed = detect_changes(old_list, new_list)
print(f"Added: {added}, Removed: {removed}")

6.3. Algorithm Testing

Comparing expected and actual outputs is fundamental in software development to confirm the correctness of algorithms.

Code Example:

def test_algorithm(input_data, expected_output, algorithm):
    actual_output = algorithm(input_data)
    if actual_output == expected_output:
        return True
    else:
        return False

def example_algorithm(data):
    return sorted(data)

input_data = [5, 4, 3, 2, 1]
expected_output = [1, 2, 3, 4, 5]

if test_algorithm(input_data, expected_output, example_algorithm):
    print("Algorithm test passed")
else:
    print("Algorithm test failed")

6.4. Searching and Filtering

Locating specific items or differences in datasets enables more efficient data processing and analysis.

Code Example:

def search_list(data_list, search_term):
    results = [x for x in data_list if search_term in str(x)]
    return results

data_list = ['apple', 'banana', 'orange', 'grape']
search_term = 'apple'

results = search_list(data_list, search_term)
print(f"Search results: {results}")

6.5. Eliminating Redundancy

Removing duplicate entries across multiple lists streamlines data management and reduces errors.

Code Example:

def remove_duplicates(list1, list2):
    combined_list = list1 + list2
    unique_list = list(set(combined_list))
    return unique_list

list_a = [1, 2, 3, 4, 5, 1, 2]
list_b = [3, 4, 5, 6, 7, 6]

unique_list = remove_duplicates(list_a, list_b)
print(f"Unique list: {unique_list}")

7. Advanced List Comparison Techniques

7.1. Using itertools for Complex Comparisons

The itertools module provides a collection of tools for working with iterators, which can be useful for complex list comparisons.

Code Example:

import itertools

def compare_lists_itertools(list1, list2):
    return all(x == y for x, y in itertools.zip_longest(list1, list2, fillvalue=None))

list_a = [1, 2, 3, 4, 5]
list_b = [1, 2, 3, 4, 5]
list_c = [1, 2, 3, 4]

print(f"List A and List B are the same: {compare_lists_itertools(list_a, list_b)}")
print(f"List A and List C are the same: {compare_lists_itertools(list_a, list_c)}")

Explanation:

  • zip_longest(): This function from itertools allows you to iterate over two lists of different lengths, filling in missing values with a specified fillvalue.
  • all(): This function returns True if all elements in the iterable are true.

Advantages:

  • Handles Different Lengths: The zip_longest() function allows you to compare lists of different lengths.
  • Conciseness: The code is compact and readable.

Disadvantages:

  • Complexity: Requires understanding of the itertools module.

7.2. Custom Comparison Functions

You can define custom comparison functions to compare lists based on specific criteria.

Code Example:

def compare_lists_custom(list1, list2, compare_func):
    if len(list1) != len(list2):
        return False
    for i in range(len(list1)):
        if not compare_func(list1[i], list2[i]):
            return False
    return True

def custom_compare(x, y):
    return abs(x - y) < 0.1

list_a = [1.0, 2.0, 3.0, 4.0, 5.0]
list_b = [1.05, 2.02, 2.95, 4.01, 4.99]

print(f"List A and List B are the same: {compare_lists_custom(list_a, list_b, custom_compare)}")

Explanation:

  • Custom Comparison Function: The custom_compare() function defines a specific comparison criterion (in this case, checking if the absolute difference between two numbers is less than 0.1).
  • compare_lists_custom(): This function takes a custom comparison function as an argument and uses it to compare the elements of the lists.

Advantages:

  • Flexibility: Allows you to define custom comparison logic.
  • Reusability: The custom comparison function can be reused in different contexts.

Disadvantages:

  • Complexity: Requires defining a custom comparison function.

7.3. Comparing Lists of Objects

When comparing lists of objects, you need to define how objects are compared.

Code Example:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __eq__(self, other):
        return self.name == other.name and self.age == other.age

list_a = [Person('Alice', 30), Person('Bob', 25)]
list_b = [Person('Alice', 30), Person('Bob', 25)]

print(f"List A and List B are the same: {list_a == list_b}")

Explanation:

  • __eq__() Method: This special method defines how objects of the Person class are compared for equality.
  • Object Comparison: The == operator uses the __eq__() method to compare the objects in the lists.

Advantages:

  • Object-Specific Comparison: Allows you to define how objects are compared.
  • Readability: Makes the code more readable and maintainable.

Disadvantages:

  • Class Modification: Requires modifying the class to define the __eq__() method.

8. Best Practices for List Comparison

8.1. Choose the Right Method

Choosing the right method for list comparison depends on the specific requirements of your task:

  • == Operator: Use for simple equality checks when the order of elements matters.
  • sort()/sorted(): Use when the order of elements does not matter.
  • set(): Use when you want to compare unique elements, ignoring order and duplicates.
  • collections.Counter(): Use when you want to compare the frequency of elements.
  • for Loop: Use when you need fine-grained control over the comparison process or when you need to identify differences.
  • NumPy: Use for numerical data when performance is critical.

8.2. Optimize for Performance

For very large lists, performance can become a concern. Here are some tips to optimize the comparison process:

  • Early Exit: Always check the lengths of the lists first and exit early if they are not equal.
  • Use zip(): The zip() function can be more efficient than index-based iteration in some cases.
  • Avoid Unnecessary Operations: Minimize the number of operations inside the loop.
  • Consider NumPy: For numerical data, consider using NumPy arrays and vectorized operations.

8.3. Handle Different Data Types

When comparing lists with mixed data types, ensure that the comparison logic can handle different types appropriately.

8.4. Write Clear and Readable Code

Write clear and readable code to make it easier to understand and maintain. Use meaningful variable names, add comments, and follow consistent coding conventions.

9. Common Mistakes to Avoid

9.1. Assuming Order Matters When It Doesn’t

Be aware of whether the order of elements matters for your specific use case. If it doesn’t, use methods like set() or collections.Counter() that ignore order.

9.2. Not Handling Different Data Types

Ensure that your comparison logic can handle different data types appropriately. If you’re comparing lists with mixed data types, add type checks to avoid errors.

9.3. Overlooking Duplicates

Be aware of whether duplicates matter for your specific use case. If they don’t, use methods like set() that treat multiple occurrences of the same element as a single element.

9.4. Inefficient Code for Large Lists

Avoid inefficient code for large lists. Use optimized methods like NumPy arrays and vectorized operations when possible.

10. FAQ About List Comparison in Python

Q1: How do I compare two lists in Python to see if they are exactly the same?

Use the == operator. This operator checks if the lists have the same elements in the same order.

list1 = [1, 2, 3]
list2 = [1, 2, 3]
print(list1 == list2)  # Output: True

Q2: How can I compare two lists while ignoring the order of elements?

Convert the lists to sets and compare the sets. This will check if both lists contain the same elements regardless of order.

list1 = [1, 2, 3]
list2 = [3, 1, 2]
print(set(list1) == set(list2))  # Output: True

Q3: How do I find the differences between two lists?

You can use list comprehension to find the elements that are in one list but not the other.

list1 = [1, 2, 3, 4]
list2 = [3, 4, 5, 6]
diff = [x for x in list1 if x not in list2] + [x for x in list2 if x not in list1]
print(diff)  # Output: [1, 2, 5, 6]

Q4: Can I compare two lists with different data types?

Yes, but you need to handle the type differences explicitly. You can either convert the elements to a common type before comparison or use a custom comparison function.

list1 = [1, 2, 3]
list2 = ['1', '2', '3']
print([str(x) for x in list1] == list2)  # Output: True

Q5: How can I compare two lists to check if they have the same elements with the same frequency?

Use the collections.Counter class to count the frequency of each element and then compare the counters.

from collections import Counter
list1 = [1, 2, 2, 3]
list2 = [1, 2, 3, 2]
print(Counter(list1) == Counter(list2))  # Output: True

Q6: What is the most efficient way to compare two very large lists?

For numerical data, using NumPy arrays and the numpy.array_equal function is the most efficient way. For other types of data, using sets or counters can be more efficient than using loops.

import numpy as np
list1 = [1, 2, 3]
list2 = [1, 2, 3]
array1 = np.array(list1)
array2 = np.array(list2)
print(np.array_equal(array1, array2))  # Output: True

Q7: How do I compare two lists of objects?

You need to define the __eq__ method in your class to specify how two objects should be compared.

class MyObject:
    def __init__(self, value):
        self.value = value

    def __eq__(self, other):
        return self.value == other.value

list1 = [MyObject(1), MyObject(2)]
list2 = [MyObject(1), MyObject(2)]
print(list1 == list2)  # Output: True

Q8: How can I ignore case when comparing two lists of strings?

Convert all strings to lowercase (or uppercase) before comparing them.

list1 = ['apple', 'Banana']
list2 = ['Apple', 'banana']
print([x.lower() for x in list1] == [x.lower() for x in list2])  # Output: True

Q9: Is it possible to compare lists using the reduce() and map() functions?

Yes, you can use `reduce

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *