将冗余字典转换为函数时遇到问题

时间:2020-04-10 14:04:23

标签: python function dictionary tuples

我在将真正多余的字典转换为函数(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

请帮助我

4 个答案:

答案 0 :(得分:0)

您正在尝试使用字符串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返回一个以变量名作为键,以变量值作为值的字典,因此它实际上完成了将值存储在dict中的操作。

例如,如果您要将其全部存储在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')

答案 1 :(得分:0)

您给的:

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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'))