Создать переменные из списка PYTHON - PullRequest
0 голосов
/ 04 февраля 2020

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

Моя первая попытка была с использованием операторов if / else более 9 строк (слишком длинных), затем я попытался создать for l oop, но затем он стал еще длиннее (3 переменные с 3 возможные значения = 27 возможных комбинаций), поэтому я не добавил это к вопросу. Я также подумал, что мог бы создать словарь с переменными в качестве ключей (rdict = {rate1 : value1, rate2 : value2, rate3 : value3,}), а затем переназначить ключи в соответствии со значениями списка, но я не мог понять, как это сделать.

Есть ли способ, которым я могу переписать это, чтобы оно было более компактным?

if (rates[0] <= 999):
    rate1 = rates[0]
elif (rates[0] <= 999999):
    rate1 = rates[0] / 1000
elif (rates[0] > 999999):
    rate1 = rates[0] / 1000000

if (rates[1] <= 999):
    rate2 = rates[1]
elif (rates[1] <= 999999):
    rate2 = rates[1] / 1000
elif (rates[1] > 999999):
    rate2 = rates[1] / 1000000

if (rates[2] <= 999):
    rate3 = rates[2]
elif (rates[2] <= 999999):
    rate3 = rates[2] / 1000
elif (rates[2] > 999999):
    rate3 = rates[2] / 1000000

print("Rate1 : \t" + str(rate1) + " \n Rate2 : \t" + str(rate2) + " \n Rate3 : \t" + str(rate3))

Ответы [ 3 ]

4 голосов
/ 04 февраля 2020

Мы можем сделать замечание, что 3 фрагмента (для каждого rates элемента) эквивалентны, поэтому они могут быть преобразованы в функцию:

if (rates[0] <= 999):
    rate1 = rates[0]
elif (rates[0] <= 999999):
    rate1 = rates[0] / 1000
elif (rates[0] > 999999):
    rate1 = rates[0] / 1000000

становится

def map_rate(rate):
    if rate <= 999:
        return rate
    elif rate <= 999999:
        return rate / 1000
    else:
        return rate / 1000000

и теперь вы можете назвать это как

rate1 = map_rate(rates[0])
rate2 = map_rate(rates[1])
rate3 = map_rate(rates[2])

, что уже хорошо. Однако нет реальной причины использовать свободные переменные (rate1, et c.); вместо этого вы можете использовать понимание списка, чтобы сопоставить каждое значение в rates с новым списком:

mapped_rates = [map_rate(rate) for rate in rates]

Затем довольно просто распечатать все сопоставленные показатели, независимо от их количества. Я использую функцию enumerate(), чтобы также получить индекс курса.

for i, rate in enumerate(mapped_rates, 1):
    print("Rate{}:\t{}".format(i, rate))

В общем, это становится (без объявления map_rate() сверху):

rates = [3524, 4509353, 36333]
mapped_rates = [map_rate(rate) for rate in rates]
for i, rate in enumerate(mapped_rates, 1):
    print("Rate{}:\t{}".format(i, rate))
1 голос
/ 04 февраля 2020

Вы можете использовать функцию.

def convert_rate(rate):
    if rate <= 999:
        return rate
    elif rate <= 999999:
        return  rate / 1000
    elif rate > 999999:
        return rate / 1000000


rates = [0, 1000, 1000000]
rate1 = convert_rate(rates[0])
rate2 = convert_rate(rates[1])
rate3 = convert_rate(rates[2])

print("Rate1 : \t" + str(rate1) + "\nRate2 : \t" + str(rate2) + "\nRate3 : \t" + str(rate3))
1 голос
/ 04 февраля 2020

Вы должны извлечь свою логику c в функцию:


def reformat(n: int):
    while n > 1000:
        n = n / 1000
    return str(n)

print(
    "Rate1 : \t" + reformat(rates[0]) +
    " \n Rate2 : \t" + reformat(rates[1]) +
    " \n Rate3 : \t" + reformat(rates[2])
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...