Как создать переменные на лету в Python? - PullRequest
0 голосов
/ 28 января 2020

У меня есть следующий словарь и код, я хочу объединить значения словаря, если заголовок и хвост значений одинаковы:

    import random

    dic={'1':[(1,2,4,3),(1,2,3,1)],'2':[(2,4,2,3),(2,6,5,3)],'3':[(3,5,9,1),(3,2,5,2),(3,7,8,1)]}

    c1= (1,2,4,3)
    c2=random.choice(dic[str(c1[-1])])
    c3=random.choice(dic[str(c2[-1])])
    c4=random.choice(dic[str(c3[-1])])
    c5=random.choice(dic[str(c4[-1])])
    print(c1,c2,c3,c4,c5)

Я получаю такой результат: (1, 2, 4, 3) (3, 5, 9, 1) (1, 2, 4, 3) (3, 2, 5, 2) (2, 4, 2, 3) Словарь имеет первый элемент кортежа в качестве ключа, для данного c1 я использую последний элемент c1 в качестве ключа, чтобы получить случайный кортеж из dic, таким образом, я получаю c2 c3 c4 c5. Мой вопрос: я хочу написать функцию со встроенным вводом, который может быть 10 или 20, чтобы я мог получить c10, c20 итеративно, не так, как сейчас, я должен написать каждый шаг c1, c2, c3, c4, c5, c6 ....

Просто, как динамически создавать переменные>

Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 28 января 2020

Я думаю, что использование рекурсии - хороший подход для решения этой проблемы.

import random

def concatenator(dictionary, i, key=1):
    if i > 0:
        tuple_chosen = random.choice(dictionary[str(key)])
        next_key = tuple_chosen[-1]
        return str(tuple_chosen) + concatenator(dictionary, i-1, key=next_key)
    else:
        return ""

Использование этой функции следующим образом: (i - количество кортежей, которое вы хотите иметь в конце)

dic = {'1': [(1,2,4,3),(1,2,3,1)],
       '2': [(2,4,2,3),(2,6,5,3)],
       '3': [(3,5,9,1),(3,2,5,2),(3,7,8,1)]}

concatenator(dic, 5)
# outputs: '(1, 2, 3, 1)(1, 2, 3, 1)(1, 2, 3, 1)(1, 2, 3, 1)(1, 2, 3, 1)'
0 голосов
/ 28 января 2020

Вы можете сделать это с помощью понимания списка, используя оператор выражения присваивания := в Python 3.8.

>>> import random
>>> dic={'1':[(1,2,4,3),(1,2,3,1)],'2':[(2,4,2,3),(2,6,5,3)],'3':[(3,5,9,1),(3,2,5,2),(3,7,8,1)]}
>>> y = (1,2,4,3)
>>> n = 20
>>> [(y:=random.choice(dic[str(y[-1])])) for _ in range(n)]
[(3, 2, 5, 2), (2, 4, 2, 3), (3, 7, 8, 1), (1, 2, 4, 3), (3, 2, 5, 2), (2, 4, 2, 3), (3, 7, 8, 1), (1, 2, 4, 3), (3, 5, 9, 1), (1, 2, 3, 1), (1, 2, 3, 1), (1, 2, 3, 1), (1, 2, 4, 3), (3, 2, 5, 2), (2, 4, 2, 3), (3, 7, 8, 1), (1, 2, 3, 1), (1, 2, 3, 1), (1, 2, 3, 1), (1, 2, 4, 3)]

Начальный выбор y на самом деле не имеет значения, пока str(y[-1]) - это ключ к dic.

0 голосов
/ 28 января 2020

Так что, не понимая вашего вопроса, я предполагаю, что вам нужен автоматизированный способ создания переменных на лету, то есть переменные c<n>, не вводя их самостоятельно.

У вас есть два метода:

  1. Использование exec: exec используется для выполнения Python кода из самого кода. Таким образом, вы можете попробовать что-то вроде этого:
inp = int(input('How many? ))
for i in range(inp):
    val = 20 # Enter the value here
    exec(f"c{i}=val")

Но это не рекомендуется

Использование словаря: словари предназначены для этого и идеально подходят здесь
inp = int(input("How many? "))
vals = {}
for i in range(inp):
    val = 10 # Value
    vals[f"c{i}"] = val # or simply vals[i]
...