【问题标题】:How to pass multiple values from user and search them in a dictionary to return the key如何从用户传递多个值并在字典中搜索它们以返回键
【发布时间】:2021-08-14 14:23:38
【问题描述】:

我有这本词典:

sales = {
    "January": 15000, "February": 22000, "March": 12000,
    "April": 17000, "May": 81000, "June": 13000,
    "July": 21000, "August": 41200, "September": 25000,
    "October": 21500, "November": 91000, "December": 21000
}

我希望用户能够输入任意数量的值,然后根据输入的值打印一个或多个键,如果该值不在字典中,则必须返回“未找到” ”。

我试过用这个:

search = int(sys.argv[1])
sales_inv = {v: k for k, v in sales.items()}
if search in sales.values():
    for key, value in sales.items():
        if search == value:
            print(key)
else:
    print("not found")

但是当我打印时,它只会搜索一个值,如果我想搜索例如:17000 和 13000,它只会返回“April”。

【问题讨论】:

    标签: python


    【解决方案1】:

    我认为要获取多个参数,您可以从索引 1 开始遍历 sys.argv,而不是只获取 sys.argv[1],这只会给出第二个参数值

    import sys
    
    sales = {
    "January": 15000, "February": 22000, "March": 12000, "April": 17000, "May": 81000, "June": 13000, "July": 21000, "August": 41200,"September": 25000, "October": 21500, "November": 91000, "December": 21000}
    sales_inv = {v: k for k, v in sales.items()}
    
    for search in sys.argv[1:]:
        search = int(search)
        if search in sales.values():
            for key, value in sales.items():
                if search == value:
                    print(key)
        else:
            print("not found")
    

    【讨论】:

    【解决方案2】:

    我强烈建议为此使用argparseArgumentParser。它提供了很多开箱即用的灵活性,例如add_arguments()nargs 参数,它允许自动将传递给程序的参数收集到一个列表中。

    我会这样做:

    from argparse import ArgumentParser
    
    SALES = {
        "January": 15000,
        "February": 22000,
        "March": 12000,
        "April": 17000,
        "May": 81000,
        "June": 13000,
        "July": 21000,
        "August": 41200,
        "September": 25000,
        "October": 21500,
        "November": 91000,
        "December": 21000,
    }
    
    parser = ArgumentParser()
    parser.add_argument(
        "sales_numbers",
    
        # Used in help messages.
        metavar="SALES_NUMBER",
    
        # Convert the input to integer,
        # print an error if non-integer value is passed in.
        type=int,
    
        # Gather all arguments in a list,
        # print an error if no arguments have been passed in.
        nargs="+",
    )
    args = parser.parse_args()
    
    # Make the list a set, in case of duplicate input.
    sales_numbers = set(args.sales_numbers)
    
    for month, value in SALES.items():
        if value in args.sales_numbers:
            print(month)
    
    # Get a set of numbers that were input but not there.
    not_found = sales_numbers - set(SALES.values())
    
    for num in not_found:
        print(f"{num} not found")
    

    您现在可以运行它并传入参数,例如:

    $ my_script.py 123
    123 not found
    
    $ my_script.py 15000
    January
    
    $ my_script.py 21000
    July
    December
    
    $ my_script.py 21000 15000
    January
    July
    December
    
    $ my_script.py 21000 15000 123 9999
    January
    July
    December
    123 not found
    9999 not found
    

    如果您忘记传入参数:

    $ my_script.py
    usage: my_script.py [-h] SALES_NUMBER [SALES_NUMBER ...]
    my_script.py: error: the following arguments are required: SALES_NUMBERS
    

    当你传入无法转换为整数的东西时:

    $ my_script.py abc
    usage: my_script.py [-h] SALES_NUMBER [SALES_NUMBER ...]
    my_script.py: error: argument SALES_NUMBER: invalid int value: 'abc'
    

    带有方便的--help 参数:

    $ my_script.py --help
    usage: sf_args.py [-h] SALES_NUMBER [SALES_NUMBER ...]
    
    positional arguments:
      SALES_NUMBER
    
    optional arguments:
      -h, --help show this help message and exit
    

    【讨论】:

    • 是的,可以,也可以通过add_subparser添加子命令。
    • description 和 epilog 应该去哪里,如果它们仍然是 ArgumentParser() 的有效条目
    • 您可以在创建时简单地将参数传递给ArgumentParser()parser = ArgumentParser(description="My script that does stuff.", epilog="That's it folks!")。它将显示在帮助中。
    【解决方案3】:

    好吧,我像往常一样迟到了,但我仍然在这里尝试(值得 10 分钟修改 sys.arg):

    import sys
    
    sales = {"January": 15000, "February": 22000, "March": 12000, "April": 17000, "May": 81000,
             "June": 13000, "July": 21000, "August": 41200,"September": 25000,
             "October": 21500, "November": 91000, "December": 21000}
    
    
    
    
    search = [int(sys.argv[x]) for x in range(1 , len(sys.argv))]
    
    
    sales_inv = {v: k for k, v in sales.items()}
    
    
    for i in search:
        if i in sales.values():
    
            for key, value in sales.items():
        
                if i == value:   
    
                    print(i,' is : ', key)
        else:
        
            print(i,"not found")
    

    它是相同的@user696969,但最愚蠢的版本,使用 argparse 它的冷却器

    【讨论】:

      猜你喜欢
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 2017-12-02
      相关资源
      最近更新 更多