Как мне написать программу, которая отображает значения в этом списке чисел, отсортированных по их наибольшему простому множителю?

#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]