Возникла проблема с превращением избыточного словаря в функцию - PullRequest
0 голосов
/ 10 апреля 2020

У меня проблемы с преобразованием действительно избыточного словаря в функцию (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. У меня есть не только Pen и Paper, но, вероятно, еще 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 голосов
/ 10 апреля 2020

Если вам необходимо быть более гибким с вашей структурой данных, вы также можете полагаться на ключи semanti c, а не работать с индексами кортежей.

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'))
0 голосов
/ 10 апреля 2020

Как вы указали:

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
0 голосов
/ 10 апреля 2020

Вы можете написать свои данные в виде словаря с самого начала (значения в словаре могут быть любого типа, кортеж в порядке):

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
0 голосов
/ 10 апреля 2020

Вы пытаетесь использовать строку 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 file:

{
    "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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...