从输入添加新变量和值到列表

时间:2018-03-04 20:00:15

标签: python list variables

好的,所以我环顾四周,看到了类似的问题,并尝试了一些不同的东西。这是我想要完成的。我有一个已经分配给它们的浮点值的变量列表。我希望能够要求用户从列表中选择一个变量并将浮点值添加到现有变量或创建一个新变量并为其赋值并将其添加到列表中。 (我使用的是python 3)

这是我目前的

A = 0.00
B = 0.00
C = 0.00

List = [A,B,C]
while True:
    Var = int(input("add to A(0), B(1), C(2) or add new varible (100)"))
    if Var != 100:
        amount = float(input("amount"))
        List[Var] = List[Var] + amount
    if Var == 100:
        newVar = input("Var name, amount").split(' ')
        newVar[0] = float(newVar[1])
        List = List + newVar[0]

所以我试图让用户命名变量并定义数量,然后将其添加到此列表中。当我运行它时,我收到此消息

Traceback (most recent call last):
  File "/Users/jmc/Documents/test.py", line 14, in <module>
    newVar[0] = float(newVar[1])
IndexError: list index out of range

我相信添加到现有功能部分很好。如果有人可以告诉我哪里出错了,或者这是一种荒谬的做法,我真的很感激。如果是,那么什么是更有效的方式?

2 个答案:

答案 0 :(得分:0)

from textwrap import dedent


def add_new_variable(variables):
    name = input('Enter a name for the new variable: ')
    value = get_number(
        msg='Enter a value for the new variable: ',
        num_type=float
    )
    return variables + [(name, value)]


def add_to_existing_variable(variables):
    result = list(variables)
    for i, (k, v) in enumerate(variables, start=1):
        print('{}) {} = {}'.format(i, k, v))
    variable = get_number(
        msg='Choose a variable to add to: ',
        num_type=int,
        minimum=1,
        maximum=len(variables)
    )
    amount = get_number(
        msg='Enter a value to add: ',
        num_type=float
    )
    prev_name, prev_value = result[variable - 1]
    result[variable - 1] = (prev_name, prev_value + amount)
    return result


def get_menu_option():
    menu_options = dedent("""
        1) Add to existing variable
        2) Add a new variable
    """)
    print(menu_options)
    return get_number(
        msg='Choose an option: ',
        num_type=int,
        minimum=1,
        maximum=2
    )


def get_number(msg, num_type, minimum=float('-inf'), maximum=float('inf')):
    while True:
        try:
            number = num_type(input(msg))
        except ValueError:
            pass
        else:
            if minimum <= number <= maximum:
                return number


def main():
    variables = [
        ('A', 0),
        ('B', 0),
        ('C', 0)
    ]
    while True:
        menu_option = get_menu_option()
        if menu_option == 1:
            variables = add_to_existing_variable(variables)
        else:
            variables = add_new_variable(variables)


if __name__ == '__main__':
    main()

答案 1 :(得分:0)

只要输入包含空格,该程序就不应该抛出IndexError。 如果您的输入不包含空格,则按' '拆分将创建一个长度为1的列表,其中包含整个输入字符串,如果您尝试访问索引处的元素,则会导致IndexError { {1}}。

解决方案是将每个变量分配给自己的1

input

但是,在当前形式下,您的代码会在下一行抛出var_name = input("Var name: ") amount = float(input("Amount: "))

TypeError

您需要将TypeError: can only concatenate list (not "float") to list 变量转换为列表以进行连接。您可以使用方括号来执行此操作:

amount

虽然现在可以使用,但是如果要将名称与列表中存储的值相关联,则可能需要使用dictionary。这允许您访问存储值的名称,而不是使用dict.keys()

在输出字符串中对它们进行硬编码

但是,您需要检查一下,如果用户选择添加新名称,它就不是字典中的键,因为之前的值会被覆盖。

该计划的起点可能如下所示:

List = List + [newVar[0]]

虽然您可能不想为字典List = {"A" : 0.00, "B" : 0.00, "C": 0.00} while True: names = List.keys() Var = input("Add to {} or add new variable (100): ".format(", ".join(names))) if Var in names: amount = float(input("Amount: ")) List[Var] += amount elif Var == "100": var_name = input("Var name: ") if var_name not in List: amount = float(input("Amount: ")) List[var_name] = amount else: print("That name is already in use.") else: pass 命名。