5 Best Ways to Find Integers Not Divisible by 2 or 3 in a Range

πŸ’‘ Problem Formulation: We aim to write a Python program capable of identifying all integers between 1 and 50 that are not divisible by 2 or 3. Such numbers are unique in that they do not align with typical factors of even and triadic series. For example, within the range of 1 to 50, integers like 1, 5, and 7 satisfy this condition as they cannot be divided evenly by 2 or 3.

Method 1: Iterative Approach

This method involves a simple for-loop iterating through numbers 1 to 50 and checking for divisibility by 2 and 3. The if condition within the loop evaluates to True if the number is not divisible by 2 or 3, in which case the number is printed.

Here’s an example:

for num in range(1, 51):
    if num % 2 != 0 and num % 3 != 0:
        print(num)

Output:

1 5 7 11 13 17 19 23 25 29 31 35 37 41 43 47 49

The code snippet creates a loop that traverses through numbers 1 to 50 using range(1, 51) and checks each number for divisibility by 2 and 3. It outputs numbers that do not meet either condition.

Method 2: List Comprehension

List comprehension provides a compact syntax for deriving a list of the desired numbers. It integrates the iteration and conditionality into a single line, enhancing readability and efficiency. The result is an easily-understood list of numbers not divisible by 2 or 3.

Here’s an example:

print([num for num in range(1, 51) if num % 2 != 0 and num % 3 != 0])

Output:

[1, 5, 7, 11, 13, 17, 19, 23, 25, 29, 31, 35, 37, 41, 43, 47, 49]

This compact code snippet utilizes list comprehension to construct and print the list of numbers in the specified range that are not divisible by 2 or 3.

Method 3: Using filter and lambda

Filter and lambda functions in Python can be used in tandem to filter out a collection of items that meet certain criteria. Here, the filter() method applies a lambda function that encapsulates the non-divisibility condition to each element in the range.

Here’s an example:

filtered_numbers = filter(lambda x: x % 2 != 0 and x % 3 != 0, range(1, 51))
print(list(filtered_numbers))

Output:

[1, 5, 7, 11, 13, 17, 19, 23, 25, 29, 31, 35, 37, 41, 43, 47, 49]

The lambda function serves as an anonymous condition check within the filter() function, and the list() call is used to convert the returned filter object into a list for output.

Method 4: Using numpy

For those familiar with numerical computing in Python, numpy offers a vectorized way of computing elements that meet the criteria. By using boolean indexing, one can efficiently filter out elements in a numpy array. This method is optimal for large datasets.

Here’s an example:

import numpy as np

numbers = np.arange(1, 51)
filtered_numbers = numbers[(numbers % 2 != 0) & (numbers % 3 != 0)]
print(filtered_numbers)

Output:

[ 1  5  7 11 13 17 19 23 25 29 31 35 37 41 43 47 49]

This snippet first generates a numpy array of numbers from 1 to 50. Then, the array is filtered using a condition expressed as a boolean array, and the result is printed out.

Bonus One-Liner Method 5: Generator Expression

A generator expression offers a memory-efficient approach and is especially useful for large ranges. It is similar to list comprehension but uses round parentheses instead of square brackets and yields items one by one.

Here’s an example:

print(*(num for num in range(1, 51) if num % 2 != 0 and num % 3 != 0))

Output:

1 5 7 11 13 17 19 23 25 29 31 35 37 41 43 47 49

The generator expression within the print() function is an elegant one-liner that neatly outputs all the numbers not divisible by 2 or 3.

Summary/Discussion

  • Method 1: Iterative Approach. Strengths: Simple and straightforward. Weaknesses: Can be slow for very large ranges due to explicit loop.
  • Method 2: List Comprehension. Strengths: Concise and readable. Weaknesses: Creates a list in memory, which could be inefficient for large ranges.
  • Method 3: Using filter and lambda. Strengths: Functional programming style, potentially more readable. Weaknesses: Slightly less intuitive for those not familiar with lambda and filter.
  • Method 4: Using numpy. Strengths: Fast and efficient for large arrays; uses element-wise operations. Weaknesses: Requires an external library.
  • Method 5: Generator Expression. Strengths: Memory efficient; doesn’t create a list in memory. Weaknesses: Can only iterate through once without storing the values.