Код Python для заполнения списка работает, но аналогичный код для заполнения вектора не работает в R - PullRequest
0 голосов
/ 25 марта 2019

Получить вектор, состоящий из простых чисел, в качестве выходных данных из заданного входного вектора.Работал в Python, где я добавлял каждое простое число из списка ввода в пустой список, но не получал правильного вывода в R

Код Python:

def get_prime(input_list):
    output_list = []
    for num in input_list:
        for i in range(2, num):
                if num%i == 0:
                    break
        else:   
            output_list.append(num)
    return output_list

Вывод:

get_prime([3,4,5,6,7,8])
[3, 5, 7]

R Код:

get_prime <- function(input_number_vector){
  prime = c()
  for(num in input_number_vector){
    for(div in 2:(num-1)){ if(num %% div == 0) break 
                           else prime = c(prime,num)
                                                   }
    }
  prime
}

Вывод:

x <- c(3,4,5,6,7,8)
> get_prime(x)
[1] 3 5 5 5 7 7 7 7 7

Ожидаемый вывод:

3,5,7

Похож на нечетные числа: 3, 5,7 добавляются один раз для каждой проверки состояния модуля.т.е. 3 раза с делителем 2,5, трижды с делителями 2,3,4 и 7 с делителями 2,3,4,5,6.Может кто-нибудь сообщить мне, где я иду не так, и если R работает в этом отношении иначе, чем Python.

Ответы [ 2 ]

1 голос
/ 25 марта 2019

for..else - довольно симпатичная конструкция , уникальная для Python . То, что вы говорите, что if мы не нарушаем в for, мы добавляем. R не имеет такой конструкции, и поэтому else сопоставляется с if. Вы также, похоже, интерпретируете пространственное управление синтаксиса Python таким же здесь - это опять-таки уникальная вещь Python. Любой другой язык, который я знаю, который встречает if...else, будет интерпретировать их вместе, независимо от перевода строки / пробела между ними, чего вы не могли ожидать.

Самый простой способ сделать это без специальной конструкции Python - это использовать флаг перед циклом, is_prime<-1, и установить его в 0, если вы обнаружите, что это не так. Затем из цикла проверьте if(is_prime) и добавьте, если так. В результате изменения тела внешнего цикла:

is_prime<-TRUE
for(div in 2:(num-1)) {
    if(num %% div == 0) {
        is_prime<-FALSE
        break 
    }
}
if (is_prime) prime = c(prime,num)
0 голосов
/ 25 марта 2019

Очевидно, что есть лучшие способы, чтобы закодировать это, но что касается отладки вашего кода, вот некоторые наблюдения.

else в коде Python находится вне блока if, тогда как в коде R вы представляете его на том же уровне, что и if. Наличие else как в Python разрешено , тогда как то же самое не разрешено в R. Если вы попытаетесь использовать то же самое в R, вы получите ошибку. (под тем же самым я имею в виду наличие else без if).

Другим пунктом является проверка, чтобы добавить число в prime только в том случае, если оно исчерпало весь 2:(num-1). С учетом этих двух изменений мы можем написать вашу функцию как

get_prime <- function(input_number_vector){
   prime = c()
   for(num in input_number_vector){
     for(div in 2:(num-1)){ 
       if(num %% div == 0) break 
     }
     if (div == num - 1)
        prime = c(prime,num)
     }
     prime
 } 

x <- c(3,4,5,6,7,8)
get_prime(x)
#[1] 3 5 7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...