从inpu向列表添加新变量和值

2024-03-29 08:09:38 发布

您现在位置:Python中文网/ 问答频道 /正文

好的,所以我环顾四周,看到了类似的问题,并尝试了一些不同的事情。这就是我想要达到的目标。我有一个变量列表,上面已经分配了浮点值。我希望能够要求用户从列表中选择一个变量,并将浮点值添加到现有变量中,或者创建一个新变量,并为其赋值,然后将其添加到列表中。(我使用的是python3)

这是我目前的情况

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

添加到现有的功能部分是好的,我相信。我真的很感激如果有人能告诉我哪里做错了,或者如果这是一个荒谬的方式来做这件事。如果是,有什么更有效的方法?你知道吗


Tags: 用户add目标列表inputifvarfloat
2条回答
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()

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

解决方法是将每个变量分配给它自己的input

var_name = input("Var name: ")
amount = float(input("Amount: "))

但是,在当前形式下,代码将在下一行抛出TypeError

TypeError: can only concatenate list (not "float") to list

您需要将amount变量转换为要连接的列表。可以使用方括号执行此操作:

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

尽管你可能不想给你的字典命名List。你知道吗

相关问题 更多 >