перекрытие и перечисление в python - PullRequest
0 голосов
/ 08 мая 2020

Даны два файла. Нам нужно найти все числа, перекрывающие данные из обоих файлов, которые являются простыми.

Для проверки простого числа нам нужно разработать функцию с именем check_prime и использовать ее.

Мой код:


import math
def is_prime(num):
    if num == 1:
        return False
    if num == 2:
        return True
    for i in range(2,int(math.sqrt(num))+1):
        if num % i == 0:
            return False
    return True

one = []

theFile = open("One.txt", "r")
array = []
for val in theFile:
    array.append(val)

print(array)

theFile = open("Two.txt", "r")
array1 = []
for val in theFile:
    array1.append(val)

print(array1)

for i in array:
   one.append(i)


print(one)

Ответы [ 2 ]

3 голосов
/ 08 мая 2020

Вы почти у цели, но вот недостающие биты в вашем коде:

1) Чтение из файлов

Чтобы не писать дважды один и тот же код для открытия оба файла, и для обработки более двух файлов мы можем l oop через имена файлов вместо того, чтобы открывать каждый по отдельности

Таким образом, вместо:

theFile = open("One.txt", "r")
#[...]
theFile = open("Two.txt", "r")

Мы могли бы использовать:

file_names = ['One.txt', 'Two.txt']
for i in file_names:
    theFile = open(i, "r")

2) Извлечение чисел из файлов

Затем вы извлекаете значения в текстовый файл . Список чисел в каждом файле импортируется как список, содержащий строку с числами в нем.

Итак, нам нужно сделать 2 вещи:

1) извлечь строку из списка 2) прочтите каждый номер строки в списке через запятую.

Если вы это сделаете:

for val in theFile:
    array.append(val)

, вы добавите только один список, содержащий одну строку, к вашему array.

В вашем коде вы создаете два списка: array и array1, но затем только l oop через список array, который помещает в ваш список one только данные из список array без использования array1. Не о чем беспокоиться, я также иногда путаюсь между array[1] и array1, если назову несколько списков, заканчивающихся на 1,2,3.

Так что вместо этого мы могли бы сделать:

for val in theFile:
    array = array + val.split(",")

Мы используем +, потому что нам нужны все числовые строки в одном списке, а не в одном списке, содержащем несколько списков (вы можете попробовать заменить это на: array = array.append(val.split(",")), и вы увидите получить список, содержащий списки, но мы хотим, чтобы все числовые строки из всех файлов в одном списке, поэтому лучше объединить элементы в списках в один список.

Теперь, когда у вас есть список массивов, содержащий все строковые числа из ваших текстовых файлов, вам необходимо преобразовать их в целые числа , чтобы вы могли запустить свою отличную функцию is_prime.

Итак, мы создаем второй список, который я назвал array2 где мы будем хранить строковые числа как целые числа, а не как строки.

Конечный результат, который вам нужен, представляет собой список уникальных простых чисел в обоих текстовых файлах, поэтому мы проверяем, что число отсутствует в array2 перед его добавлением.

for nbrs in array:
    if int(nbrs) not in array2:
        array2.append(int(nbrs))

Почти готово! Вы уже выполнили остальную работу оттуда:

Вам нужно передать все уникальные числа из array2 в вашу is_prime функцию, чтобы проверить, простые они или нет.

Мы сохраняем результат функции is_prime (True или False) в списке is_nbr_prime.

is_nbr_prime = []
for i in array2:
    is_nbr_prime.append(is_prime(i))

Теперь, поскольку вы хотите вернуть сами числа, мы нужно найти индексы простых чисел, чтобы извлечь их из array2, которые являются индексами значений True в is_nbr_prime:

idx = [i for i, val in enumerate(is_nbr_prime) if val] #we get the index of the values that are True in is_nbr_prime list  
unique_prime_nbrs = [array2[i] for i in idx] # we pass the index to array2 containing the list of unique numbers to take out only prime numbers.

Вот и все, у вас есть уникальные простые числа в списке unique_prime_nbrs.

Если мы объединим все шаги в две функции, окончательный код будет:

def is_prime(num):
    if num == 1:
        return False
    if num == 2:
         return True
    for i in range(2,int(math.sqrt(num))+1):
         if num % i == 0:
            return False
    return True

def check_prime(file_names):
    array = []
    array2 = []
    for i in file_names:
        theFile = open(i, "r")
        for val in theFile:
            array = array + val.split(",")    
        for nbrs in array:
            if int(nbrs) not in array2:
                array2.append(int(nbrs))

    is_nbr_prime = []
    for i in array2:
        is_nbr_prime.append(is_prime(i))

    idx = [i for i, val in enumerate(is_nbr_prime) if val]    
    unique_prime_nbrs = [array2[i] for i in idx]

    return unique_prime_nbrs

Чтобы вызвать функцию, нам нужно передать список имена файлов, например:

file_names = ['One.txt', 'Two.txt']
unique_prime_nbrs = check_prime(file_names)
print(unique_prime_nbrs)
[5, 7, 13, 17, 19, 23]
1 голос
/ 08 мая 2020

Есть куча вещей, которые вам нужно сделать:

  • При чтении текста из входных файлов преобразуйте его в целые числа перед сохранением в любом месте. 1006 * список, сделайте его набором. Это позволит тестировать членство в гораздо более короткие сроки.
  • Перед сохранением значений из первого файла в array проверьте, является ли оно простым, используя написанную вами функцию is_prime.
  • При чтении целых чисел из второго файла перед добавлением значений в array1 проверьте, есть ли они уже в array. Не нужно проверять простоту, потому что array уже будет содержать только простые числа.
  • Наконец, перед выводом значений из array1 вам нужно будет преобразовать их обратно в строки и использовать join строковый метод их соединения через запятую.

Итак, приступим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...