Im trying to get prime factors by factorizing a number and adding the factors to list1
, and then factorizing every number in list1
using the same method from before and adding to list2
, so any prime factor will have a list length of 2
(If the number is a square number it prints out the square root twice, but since it is not a prime, it doesn't matter).
I don't know how to get it to apply my factors() function to every element in the list1
and make a list of all the factorized factors I've made.
import math
list1 = []
list2 = []
def factors(num1):
for x in range(1, int(math.sqrt(num1) + 1)):
if num1 % x == 0:
list2.append(int(x))
list2.append(int(num1/x))
list2.sort()
print("enter a number:")
number = int(input())
for m in range(1, int(math.sqrt(number) + 1)):
if number % m == 0:
list1.append(int(m))
list1.append(int(number/m))
list1.sort()
for y in list1:
factors(y)
print(list2)
desired output if 20 was the input
((1,1),(1,2),(1,2,2,4)(1,5),(1,2,5,10),(1,2,4,5,10,20))
You can do this using list comprehension like so. I modified the factors
function slightly to return the list.
import math
def factors(num):
fact = []
for x in range(1, int(math.sqrt(num)+1)):
if num % x == 0:
fact.append(x)
fact.append(int(num/x))
fact.sort()
return fact
print("enter a number:")
number = int(input())
list1 = factors(number)
list2 = [factors(f) for f in list1]
Result for 20:
[[1, 1], [1, 2], [1, 2, 2, 4], [1, 5], [1, 2, 5, 10], [1, 2, 4, 5, 10, 20]]
In factors
function, you are appending the factors themselves to list2
but as you want nested list of factors, you should create another list and append that to list2
instead. Changed code would look something like this.
import math
list1 = []
list2 = []
def factors(num1):
factor_list = []
for x in range(1, int(math.sqrt(num1) + 1)):
if num1 % x == 0:
factor_list.append(int(x))
factor_list.append(int(num1/x))
factor_list.sort()
list2.append(factor_list)
print("enter a number:")
number = int(input())
for m in range(1, int(math.sqrt(number) + 1)):
if number % m == 0:
list1.append(int(m))
list1.append(int(number/m))
list1.sort()
for y in list1:
factors(y)
print(list2)
Also, since you've already wrote the factors
function, you can use it for factorizing the input number itself instead of writing the same code again. So a better version of the same code is:
import math
def factors(num1):
factor_list = []
for x in range(1, int(math.sqrt(num1) + 1)):
if num1 % x == 0:
factor_list.append(int(x))
factor_list.append(int(num1/x))
factor_list.sort()
return factor_list
print("enter a number:")
number = int(input())
list1 = factors(number)
list2 = [factors(x) for x in list1]
print(list2)
Following up on the comment, if you want to include only on those elements which have length 2, you can use another list comprehension for that:
list2 = [x for x in list2 if len(x)==2]
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.