друг с другом и записать в словарь. {15: {20:35, 30:45}, 20: {15:35, 30:50}} Я могу это сделать циклом for, но в таком случае мы дважды будем считать каждое значение. 15+20 = 20+15 это нужно избежать. Вопрос как?
Вообще довольно легко def func(s: list): result = {} for i in range(len(s) - 1): tmp = {} for j in range(i + 1, len(s)): tmp [s[j]] = s[j] + s[i] result[s[i]] = tmp return result
Тогда последнего элемента не будет )
Так ты вроде так и написал. У тебя входной лист [15, 20, 30] , а результат {15: {20:35, 30:45}, 20: {15:35, 30:50}}
У тебя ж последний элемент и так со всеми уже сложен
{15: {20:35, 30:45}, 20: {15:35, 30:50}, N...} надо как-то так ) мы не знаем сколько значений войдет. Я думаю через 2 фора и в словари сразу записывать. Но пока не тестил.
Словари должны быть полными, со всеми результатами друг друга
Какой словарь должен быть для последнего элемента?
Так ты напиши себе пару тестов и проверь что код выдаст
dictor = { '10': { {'20': 30}, {'30': 40} }, '20': { {'10': 30}, {'30': 50} }, '30': { {'10': 40}, {'20': 50} }, }
Ну вроде тоже легко def func(s: list): result = {} for i in range(len(s)): tmp = {} for j in range(len(s)): if j != i: tmp [s[j]] = s[j] + s[i] result[s[i]] = tmp return result
спасибо, страшно выглядит. Пойду разбираться ))
Упростить можно с помощью генераторов
Вывод правильный, но время работы такое-же. Так что написал тоже самое что и я ток по страшнее ) dictor = { '10': {}, '20': {}, '30': {}, } def calc(x, y): time.sleep(2) return int(x) + int(y) def func(arr): for x in arr: for i in arr: if x == i: continue dictor[x][i] = {i : calc(x, i)} arr = [x for x in dictor.keys()] func(arr) Что твоя функция, что моя работает 12секунд. А должна 6 так как мы можем посчитать только 10+20 10+30 20+30 что бы найти все результаты.
Так тебе типа надо не считать второй раз, но записать в словарь?
да, нужно сократить время по максимуму.
Сомневаюсь, что проблема в подсчете чисел. Я думаю проблема в двойном цикле, что делает время квадратичным
Мы просто всё еще считаем всё столько раз, сколько у нас элементов.
import time from datetime import datetime start_time = datetime.now() dictor = { '10': {}, '20': {}, '30': {}, } def calc(x, y): time.sleep(2) return int(x) + int(y) def func(arr): for x in arr: for i in arr: if x == i: continue if i not in dictor[x].keys() and x not in dictor[i].keys(): res = calc(x, i) dictor[x][i] = res # {i : res} dictor[i][x] = res # {x : res} arr = [x for x in dictor.keys()] func(arr) print(dictor) print(datetime.now() - start_time) 6 секунд.
меньше проходов получается
Обсуждают сегодня