【问题标题】:Having a problem making a redundant dictionary into a function将冗余字典变成函数时遇到问题
【发布时间】:2020-07-23 07:13:24
【问题描述】:

我在将一个真正多余的字典转换为一个函数(def)时遇到了麻烦

可以正常工作的原始代码是:

Pen = (9,'always','monday')
Paper = (1,'always','tues')
PriceDic = {'Pen': Pen[0], 
            'Paper': Paper[0]}

while True:
    name = input("name of the product?")
    print(PriceDic.get(name),'dollar')
    break

打印为...

>>>name of the product?Pen
>>>9 dollar

但是问题是

  1. 我不仅有笔和纸,还可能还有 100-200 个元组要写
  2. 并且每个元组都需要包含多个信息......所以这个程序的最终目标是能够从元组索引中获取各种信息并打印它们。

所以

我想也许我可以运行并编写这段代码......

def FindPriceFunction(x):
    Pen = (9,'always','monday')
    Paper = (1,'always','tuesday')
    FindPriceDic = { x : x[0]}
    print(FindPriceDic.get(x),'dollar')

while True:
    name = input("name of the product?")
    FindPriceFunction(name)
    break

这给了我...

>>>name of the product?Pen
>>>P dollar

请帮助我

【问题讨论】:

    标签: python function dictionary tuples


    【解决方案1】:

    您正在尝试使用字符串 x 来访问变量名称,但它不会按您期望的方式工作,例如 x 包含值“Pen”。这不一定是推荐的方法,但是您可以使用locals 函数来动态获取变量的值,如下所示:

    def FindPriceFunction(x):
        Pen = (9,'always','monday')
        Paper = (1,'always','tuesday')
        print(locals()[x][0],'dollar')
    
    while True:
        name = input("name of the product?")
        FindPriceFunction(name)
        break
    

    这里,locals 返回一个本地定义变量的字典,您可以使用字符串 x 作为键来访问变量的值。所以locals()['Pen']会给你(9,'always','monday')的值

    然而,将元组直接存储到字典中会更好(也更安全)你的代码,然后像你最初尝试的那样通过那里访问数据,除了你可以存储整个元组而不仅仅是价格,然后访问价格的元组的第一个元素。 locals 返回一个变量名作为键和变量值作为值的字典,所以它基本上完成了你首先可以做的事情,将值存储在字典中

    例如,如果您想将所有内容存储在 JSON 文件中,因为您将拥有数百个字典,您可以这样做:

    JSON 文件:

    {
        "Pen": [9, "always", "monday"],
        "Paper": [1, "always", "tuesday"]
    }
    

    代码:

    import json
    with open('prices.json', 'r') as f:
        prices = json.load(f)
    
    def FindPriceFunction(x):
        print(prices[x][0], 'dollar')
    

    【讨论】:

    • 您好,谢谢您的回复。我应该把所有的字典都写下来而不是试图减少冗余吗?但是然后.. arg 我只是想不出一种经济的方法
    • @JeewooLee 归根结底,您必须将数据存储在某处并以某种方式获取值,所以我认为将所有元组放入字典可能是您最好和最安全的最佳方式跨度>
    • @JeewooLee 因为您有很多数据,所以我添加了一个示例,说明如何将其存储在 JSON 文件中,这可能是您最简单的解决方案
    • 另一条评论@Thomas Kläger 和你的解决了我的问题!嗯 json 文件和将元组放入 dic 都可以。虽然创建一个单独的文件会更安全
    • 等等,我可以再问一个问题吗?对不起啊,你是怎么从 [9, "always","monday"] 只导入 9 的?
    【解决方案2】:

    如你所愿:

    FindPriceDic = { x : x[0]}
    print(FindPriceDic.get(x),'dollar')
    

    并使用x as Pen 调用该函数,它会打印x[0] = 'Pen'[0] = 'P'。这导致了你的问题。所以试试:

    def FindPriceFunction(x):
        FindPriceDic = {}
        FindPriceDic['Pen'] = (9,'always','monday')
        FindPriceDic['Paper'] = (1,'always','tuesday')
        print(FindPriceDic.get(x)[0],'dollar')
    
    while True:
        name = input("name of the product?")
        FindPriceFunction(name)
        break
    

    【讨论】:

    • 我简化了一点?
    【解决方案3】:

    您可以从一开始就将数据写成字典(字典中的值可以是任何类型,元组也可以):

    my_data = {
        'Pen': (9, 'always', 'monday'),
        'Paper': (1, 'always', 'tuesday')
    }
    
    def FindPriceFunction(x):
        print(my_data.get(x)[0],'dollar')
    
    while True:
        name = input("name of the product?")
        FindPriceFunction(name)
        break
    

    【讨论】:

    • 天哪,这解决了我的问题!太感谢了!我不知道我可以将值作为元组存储在 dic 中!这是完美的谢谢你的天才! ?
    【解决方案4】:

    如果您需要更灵活地使用数据结构,您还可以依赖语义键,而不是使用元组的索引。

    products.yaml

    Pen:
      price: 9
      frequency: Always
      day: Monday
    Paper:
      price: 1
      frequency: Rarely
      day: Tuesday
    Scissors:
      frequency: Often
    

    main.py

    import yaml  # pyyaml package
    
    with open("products.yaml", 'r') as stream:
        try:
            products = yaml.safe_load(stream)
        except yaml.YAMLError as exc:
            print(exc)
    print(products)
    print(products['Pen']['price'])
    
    
    def find_price(product_name):
        try:
            return products[product_name]['price']
        except KeyError:
            return "N/A"
    
    
    print(find_price('Pen'))
    print(find_price('Scissors'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      相关资源
      最近更新 更多