Перестановка списка с ключами местами каждый раз при запуске

Как можно реализовать чтобы список читался рандомно? Чтобы если вписано в переменную l = 60 то суммировало из списка эти 60 по разному а не так чтобы каждый раз выводило одно и тоже. Задумано сделать программу в которой можно ввести кол-во бензина и она просчитает сколько километров при X расходе. Рассчитав кол-во километров выводит населения, подходящие суммарно по километражу для того чтобы не считать и не думать что вписать в путевой лист

from itertools import combinations
from contextlib import redirect_stdout
import io


FACK = {60:'Тлюстен 60 км', 52:'Тугургой 52 км', 36:'Казазов 36 км',
        50:'Красненский 50 км', 28:'Пчегатлукай 28 км', 30:'Адыгейск 30 км', 26:'Вочепший 26 км', 12:'Пшикуйхабль 12 км',
        10:'Нечерезии 10 км', 8:'Нешукай 8 км', 42:'Кунчукохабль 42 км, через аулы', 56:'Кунчукохабль 56 км через трассу',
        27:'Тауйхабль 27 км', 19:'Джиджихабль 19 км', 17:'Шевченко 17 км', 37:'Габукай 37 км', 4:'тест', 33:'тест'}


l = 60 # тут вводим километры

Array = {}

f = io.StringIO()

for i in combinations(FACK, 2):# тут вписываем количество чисел на которые будет суммироваться
    if sum(i) == l:
        with redirect_stdout(f):# перехват выводимого значения на print()
            print(*i)
            break

Array = s = f.getvalue()# получает строковые значения выводимые print()'ом

ar = Array[0]
ar += Array[1]
arint = int(ar)# переабразовываем строковый в целочисленное

ar2 = Array[3]
ar2 += Array[4]
arint2 = int(ar2)

print(FACK[arint], FACK[arint2])




Тугургой 52 км Нешукай 8 км

Process finished with exit code 0

Ответы (2 шт):

Автор решения: CrazyElf

Вот вам выбор через random.choice. 10 раз выбирается один вариант, чтобы показать, что случайный выбор есть. Ну, где-то получается подряд один и тот же два раза подряд, но всё же более-менее случайно.

from itertools import combinations
from random import choice

distances = {60:'Тлюстен 60 км', 52:'Тугургой 52 км', 36:'Казазов 36 км',
        50:'Красненский 50 км', 28:'Пчегатлукай 28 км', 30:'Адыгейск 30 км', 26:'Вочепший 26 км', 12:'Пшикуйхабль 12 км',
        10:'Нечерезии 10 км', 8:'Нешукай 8 км', 42:'Кунчукохабль 42 км, через аулы', 56:'Кунчукохабль 56 км через трассу',
        27:'Тауйхабль 27 км', 19:'Джиджихабль 19 км', 17:'Шевченко 17 км', 37:'Габукай 37 км', 4:'тест', 33:'тест'}

search_sum = 60 # тут вводим километры
variants = [comb for comb in combinations(distances, 2) if sum(comb) == search_sum]
for _ in range(10):
    choosen = choice(variants)
    print(distances[choosen[0]], distances[choosen[1]])

Пример вывода:

Тугургой 52 км Нешукай 8 км
Тауйхабль 27 км тест
Кунчукохабль 56 км через трассу тест
Тауйхабль 27 км тест
Тугургой 52 км Нешукай 8 км
Красненский 50 км Нечерезии 10 км
Тауйхабль 27 км тест
Тугургой 52 км Нешукай 8 км
Тугургой 52 км Нешукай 8 км
Кунчукохабль 56 км через трассу тест

Но учтите, что вы выбрали в качестве структуры данных словарь, ключ у вас дистанция. Вы не сможете записать в словарь два одинаковых ключа. Вам придётся это всё переделывать, если попадутся два одинаковых расстояния.

→ Ссылка
Автор решения: Stanislav Volodarskiy

Во-первых словарь не позволяет иметь несколько пунктов на одном расстоянии. Сделаем список пар (расстояние, название).

Во-вторых, кто сказал что в маршруте должно быть только два пункта? Сделаем несколько. Поиск маршрута будет рекурсивный: есть слагаемые, требуется набрать сумму.

Перед поиском список расстояний случайно перемешивается.

import random


def routes(legs, target):

    def search(i, target, route):
        if i == len(legs):
            if target == 0:
                yield tuple(route)
        else:
            yield from search(i + 1, target, route)
            d, n = legs[i]
            if d <= target:
                route.append(n)
                yield from search(i + 1, target - d, route)
                route.pop()

    return search(0, target, [])

        
def main():
    legs = (
        (60, 'Тлюстен 60 км'),
        (52, 'Тугургой 52 км'),
        (36, 'Казазов 36 км'),
        (50, 'Красненский 50 км'),
        (28, 'Пчегатлукай 28 км'),
        (30, 'Адыгейск 30 км'),
        (26, 'Вочепший 26 км'),
        (12, 'Пшикуйхабль 12 км'),
        (10, 'Нечерезии 10 км'),
        ( 8, 'Нешукай 8 км'),
        (42, 'Кунчукохабль 42 км, через аулы'),
        (56, 'Кунчукохабль 56 км через трассу'),
        (27, 'Тауйхабль 27 км'),
        (19, 'Джиджихабль 19 км'),
        (17, 'Шевченко 17 км'),
        (37, 'Габукай 37 км'),
        ( 4, 'тест'),
        (33, 'тест')
    )

    dist = int(input())
    legs_list = list(legs)
    random.shuffle(legs_list)
    for r in routes(legs_list, dist):
        print(', '.join(r))


main()
$ echo 60 | python routes.py
Тлюстен 60 км
Тугургой 52 км, Нешукай 8 км
Нечерезии 10 км, Красненский 50 км
Нечерезии 10 км, Кунчукохабль 42 км, через аулы, Нешукай 8 км
Адыгейск 30 км, Нечерезии 10 км, Нешукай 8 км, Пшикуйхабль 12 км
Тауйхабль 27 км, тест
Шевченко 17 км, Нечерезии 10 км, тест
Джиджихабль 19 км, тест, Нешукай 8 км
тест, Кунчукохабль 56 км через трассу
тест, Нечерезии 10 км, Нешукай 8 км, Пшикуйхабль 12 км, Вочепший 26 км
тест, Адыгейск 30 км, Вочепший 26 км
тест, Шевченко 17 км, Тауйхабль 27 км, Пшикуйхабль 12 км
тест, Казазов 36 км, Нешукай 8 км, Пшикуйхабль 12 км
тест, Джиджихабль 19 км, Тауйхабль 27 км, Нечерезии 10 км
тест, Джиджихабль 19 км, Шевченко 17 км, Нешукай 8 км, Пшикуйхабль 12 км
тест, Джиджихабль 19 км, Габукай 37 км

$ echo 60 | python routes.py
Нешукай 8 км, Адыгейск 30 км, Пшикуйхабль 12 км, Нечерезии 10 км
Нешукай 8 км, Кунчукохабль 42 км, через аулы, Нечерезии 10 км
Тугургой 52 км, Нешукай 8 км
тест, Джиджихабль 19 км, Габукай 37 км
тест, Нешукай 8 км, Пшикуйхабль 12 км, Казазов 36 км
тест, Нешукай 8 км, Джиджихабль 19 км, Шевченко 17 км, Пшикуйхабль 12 км
тест, Тауйхабль 27 км, Шевченко 17 км, Пшикуйхабль 12 км
тест, Тауйхабль 27 км, Джиджихабль 19 км, Нечерезии 10 км
Вочепший 26 км, тест, Адыгейск 30 км
Вочепший 26 км, тест, Нешукай 8 км, Пшикуйхабль 12 км, Нечерезии 10 км
Красненский 50 км, Нечерезии 10 км
Кунчукохабль 56 км через трассу, тест
тест, Шевченко 17 км, Нечерезии 10 км
тест, Нешукай 8 км, Джиджихабль 19 км
тест, Тауйхабль 27 км
Тлюстен 60 км
→ Ссылка