Вы почти у цели, но вот недостающие биты в вашем коде:
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]