Мне удается решить четвертую проблему Project Euler, и я хочу сделать еще один шаг вперед, не только найдя ответ, но и присвоив ему соответствующие 3-значные множители. Я в основном хочу назначить соответствующие кратные значения для палиндрома, т.е. {палиндром: цифра1 цифра2}. это цифра 1 * цифра 2 = палиндром.

Для тех из вас, кто не прошел Project Euler, вот вопрос:

Палиндромное число читается одинаково в обоих направлениях. Самый большой палиндром, созданный из произведения двух двузначных чисел, равен 9009 = 91 × 99. Найдите самый большой палиндром, созданный из произведения двух трехзначных чисел.

ns = str(n)
ns_list = []
ns_list_to_int = []
#outside for loop with first 3-digit 'num' and inside loop with second 3-digit 'i'
for num in range (100,1000):
    for i in range(100,1000):
        n = i*num

#need to convert to string & check if reverse of string == string, if so append to list
        ns = str(n)
        if ns[::-1] == ns:
            ns_list.append({ns:str(i) + ' 'str(num) })

#recreate new list with integers to sort
for i in ns_list:
    ns_list_to_int.append(int(i))

#sort in descending order and call the first number 
ns_list_to_int = sorted(stuffs, key=int, reverse=True)
ns_list_to_int[0]

Попытался получить его с помощью ns_list.append ({ns: str (i) + '' str (num)}), но, похоже, это не сработало. Кроме того, не уверен, как тогда я смог бы отсортировать его, если это словарь.

0
james 17 Сен 2018 в 18:59

2 ответа

Лучший ответ

Простой подход - заменить ns_list на dict, а затем заменить ns_list.append(ns) на ns_dict[num, i] = ns.

В качестве альтернативы, чтобы сохранить палиндромы как итеративный компонент верхнего уровня, вы можете сохранить все пары, которые произвели определенный палиндром, в list, используя collections.defaultdict(list) для упрощения кода:

from collections import defaultdict

ns_dict = defaultdict(list)

#outside for loop with first 3-digit 'num' and inside loop with second 3-digit 'i'
for num in range(100,1000):
    for i in range(100,1000):
        n = i*num
        ns = str(n)
        if ns[::-1] == ns:
            ns_dict[ns].append((num, i))

Теперь, когда вы выполняете итерацию ns_dict, вы можете увидеть все пары, которые вы проверили, которые создали этот палиндром:

ns_list_with_factors = sorted(ns_dict.items(), key=lambda x: int(x[0]), reverse=True)
print(ns_list_with_factors[0])  # Displays both number and the pairs that produced it

for ns, pairs in ns_dict.items():
    ...
0
ShadowRanger 17 Сен 2018 в 16:34

Вместо добавления только продукта (вашей переменной ns), вы можете добавить кортеж / список / объект, который содержит не только число палиндромов, но также и два кратных.

Тогда все, что вам нужно изменить дальше - это функция сортировки.

Быстрый и грязный пример:

ns_list = []
ns_list_to_int = []
#outside for loop with first 3-digit 'num' and inside loop with second 3-digit 'i'
for num in range (100,1000):
    for i in range(100,1000):
        n = i*num

#need to convert to string & check if reverse of string == string, if so append to list
        ns = str(n)
        if ns[::-1] == ns:
            pint = int(ns) # convert palindrome to int
            t = (i,num,pint) # all the info you need for later
            ns_list.append(t)


#sort in descending order and call the first number
ns_list_to_int = sorted(ns_list, key=lambda x:x[2], reverse=True) # sorting by the palindrome
ns_list_to_int[0]
1
ifo20 17 Сен 2018 в 16:19