#python #list #math #prime-factoring
#python #Список #математика #разложение на простые множители
Вопрос:
Мой список
numbers = [865, 1169, 1208, 1243, 329]
Я хочу отсортировать этот список в порядке возрастания наибольшего простого множителя
Мой ввод:
import math
maxPrime = -1
n=numbers
# Print the number of 2s that divide n
while n % 2 == 0:
maxPrime = 2
n >>= 1 # equivalent to n /= 2
# n must be odd at this point,
# thus skip the even numbers and
# iterate only for odd integers
for i in range(3, int(math.sqrt(n)) 1, 2):
while n % i == 0:
maxPrime = i
n = n / i
Однако это не выводит n, и я получаю сообщение об ошибке
TypeError: unsupported operand type(s) for %: 'list' and 'int'
Мой желаемый результат:
Sorted by largest prime factor:
[290, 1243, 1208, 1169, 865]
Комментарии:
1. Арифметические операторы Python не векторизуются над списками. Вам нужно будет выполнить цикл. А еще лучше, напишите функцию, которая возвращает наибольший простой множитель данного числа, и используйте это для создания
key
аргумента дляsorted
функции.2. Кстати, я не думаю, что ваш вопрос заслуживает понижения. Python работает не так, как вы, кажется, надеетесь (возможно, вы пришли из R?), но ваш вопрос был достаточно хорошо написан и содержал соответствующий код.
3. Спасибо, Джон, да, у меня есть R-фон.
4. Ответ, который я дал, по сути, совпадает с идеей @John Coleman.
Ответ №1:
Ваша проблема находится вверху, и сообщение об ошибке довольно простое:
numbers = [865, 1169, 1208, 1243, 329]
n=numbers # n is now another reference to the list of numbers
while n % 2 == 0:
Вы не можете применить оператор модуля к списку. Я подозреваю, что то, что вы хотите здесь, это
for n in numbers:
while n% 2 == 0:
Это должно привести вас к следующей ошибке… в программе их несколько. Исправление их для вас не по теме для Stack Overflow. Смотрите этот прекрасный блог о отладке для справки.
Ответ №2:
Я думаю, вы можете сделать это лучше с пониманием списка.
import numpy as np
numbers = [865, 1169, 1208, 1243, 329]
#create function to be used in list comprehension
def largest_prime_factor(n):
i = 2
while i * i <= n:
if n % i:
i = 1
else:
n //= i
return n
#use list comprehension to get the largest common factor
largest_fact=[largest_prime_factor(x) for x in numbers]
#sort your numbers by the largest factor
answer=[x for _,x in sorted(zip(largest_fact,numbers))]
print (answer)
Out:
[329, 1243, 1208, 1169, 865]