Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

List comprehension instead of extend in loop

Can I write this code in one line? I tried use chain in list comprehension.

def divisors(n):
    result = []
    for div in range(1, int(sqrt(n)) + 1):
        if n % div == 0:
            result.extend([div, n / div])
    return list(set(result))
like image 704
Ashtart Avatar asked Jan 30 '26 05:01

Ashtart


2 Answers

A set comprehension seems appropriate. Please also note that I've used // rather than / as floating point numbers are not relevant to this problem.

from math import sqrt

def divisors(n):
    return {
        x 
        for div in range(1, int(sqrt(n)) + 1) 
        if not (n % div)
        for x in [div, n // div]
    }

divisors(15)
# {1, 3, 5, 15}

As a one-liner:

def divisors(n): return { x for div in range(1, int(sqrt(n)) + 1) if not (n % div) for x in [div, n // div] }

If you really wish to have a list, it's easy enough to turn the set into a list.

list(divisors(15))
# [1, 3, 5, 15]
like image 74
Chris Avatar answered Feb 01 '26 19:02

Chris


Are you looking for something like this ?

from math import sqrt
import itertools

def divisors(n):
    return list(set(itertools.chain.from_iterable([[div, n / div] for div in range(1, int(sqrt(n)) + 1) if n % div == 0])))
like image 22
joaopfg Avatar answered Feb 01 '26 19:02

joaopfg



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!