我正在尝试使用Python创建一个程序,允许用户输入食谱需要服务的人数,并根据旧服务号重新计算原始食谱的数量。
例如,最终的计算将是:
(ingredient quantity / old serve number) * new serve number
第一段代码用于将配方所服务的人员,成分和成分详细信息写入腌制文件。成分细节循环并存储在阵列中,以便可以存储多种成分。
serve = int (input ("Enter number of people: ")) #Prompts user for number of people the recipe will serve
recipedetails=[]#starts array
for i in range (ing_number): *#Loops 3 intented inputs by ing_number amount of times*
name = input ("Enter ingredient name: ") *#Ingredient name variable*
amount = int (input ("Enter quantity of ingredient ")) *#Quantity variable*
unit = input ("Enter unit of ingredient: ") *#Unit variable*
recipedetails.append ((name, amount, unit)) *#closes array with variables added*
recipeinfo = serve , recipedetails *# adds serve and recipedetails to recipe info variable*
recipe = open(rec_name+".dat", "wb") *#Creates .dat file with recipe name as file name.*
pickle.dump(recipeinfo, recipe) *#Adds this recipeinfo to .dat file*
这一切都正常,食谱所服务的人和成分都存储在酸洗文件中。但是,问题在于从阵列中回忆信息。需要从数组中调用可变数量,以乘以新的人数。
import os
textfiles = [f for f in os.listdir(os.curdir) if f.endswith (".dat") ] *#imports*
print (textfiles)
rec_name = input ("Enter recipe name: ") *#Prompts user for recipe name.*
rd = open (rec_name+ ".dat", "rb") *#Opens the file the user selected*
recipeinfo = pickle.load(rd) *#Gives loaded file a variable so it can be displayed*
print(recipeinfo) *# Prints recalled information*
到目前为止的代码工作正常。使用这个我可以从保存的数组中查看recipeinfo
。但是,我不知道如何将数组拆分为原始变量。
name
- 金额前显示的成分名称amount
- 需要按人数划分并乘以新金额unit
- 显示金额serve
- 需要将原始值除以获得新值。如何将这个pickle文件拆分成这些变量?
答案 0 :(得分:1)
您的结构似乎是:
recipeinfo == (serve, [(name, amount, unit), (name, amount, unit), ...])
所以你可以使用:
将recipeinfo
变回这些变量
serve, recipedetails = recipeinfo
for name, amount, unit in recipedetails:
但是,如果您只从recipedetails
获取列表pickle.load
,则可以执行以下操作:
for name, amount, unit in recipeinfo:
答案 1 :(得分:1)
这个问题并不特别与酸洗有关。
考虑:
def return_a_tuple(a, b, c):
return (a, (b, c))
x = return_a_tuple(1, 2, 3)
如何从a
中提取b
,c
和x
?
正如jonrsharpe所说,答案是做类似的事情:
(a, (b, c)) = x
另外,我怀疑不是
recipedetails.append((name, amount, unit))
recipeinfo = serve , recipedetails
你的意思是
recipedetail = (name, amount, unit)
recipedetails.append(recipedetail)
recipeinfo = serve, repcipedetail
您的原始代码正在创建成对的serve
,其中包含您目前所见的每个食谱详细信息的列表,而不仅仅是您刚读过的那个。
或者,您可以考虑使用namedtuple
:
from collections import namedtuple
RecipeDetail = namedtuple('RecipeDetail', ['name', 'amount', 'unit'])
RecipeInfo = namedtuple('RecipeInfo', ['serve', 'recipe_detail'])
然后您可以执行类似
的操作recipedetail = RecipeDetail(name, amount, unit)
recipedetails.append(recipedetail)
recipeinfo = RecipeInfo(serve, recipedetail)
现在您可以通过执行以下操作来访问子字段:
recipedetail.name
recipeinfo.recipe_detail.amount
答案 2 :(得分:0)
您想要提取包含名称,金额和单位价值的元组列表。
import sys
ingredients_list = ''
for item in recipeinfo:
if type(item) == list:
ingredients_list = item
continue
确认您找到了一个列表:
if ingredients_list == '':
print("I never found a list!")
sys.exit(1)
for name, amount, unit in ingredients_list:
print("{0}: {1} {2}").format(name, amount, unit)
. . .
并使用这些值进行计算,打印说明等。