Как я могу использовать свои вспомогательные функции для получения правильного вывода

#python #list #dictionary #tuples

Вопрос:

Поэтому я создал вспомогательную функцию, которая помогает моей основной функции извлекать информацию из словаря… а вот мой код и функция

 def rdict(recipes):  recipes_splitted = {}  for r in recipes:  recipe_name, parts = r.split(":")  recipe_parts = {}  for part in parts.split(','):  product, number = part.split('*')  recipe_parts[product] = int(number)  recipes_splitted[recipe_name] = recipe_parts  return recipes_splitted def extract(recipes, data):  result = []  for r in recipes:  tmp = []  for key in data[r]:  tmp.append(f"{key}:{data[r][key]}")  final_string = ""  for i in range(len(tmp)):  if i lt; len(tmp) - 1:  final_string  = tmp[i]   ", "  else:  final_string  = tmp[i]  result.append(final_string)  return result  

Поэтому я пытаюсь сделать так, чтобы убедиться data extract(recipe, data) , что все пройдено rdict(data) , так как rdict преобразует данные в словарь, что мне и нужно.. Однако, когда я попытался выполнить for key in rdict(data[r]): вывод, он возвращается Error. String is not supscriptable ..

что я должен сделать, чтобы успешно внедрить изменения??

Редактировать

Итак, из моего текущего кода вот пример ввода..

 print(extract(recipes = ['T-Bone', 'Green Salad1'],data = ["Pork Stew:Cabbage*5,Carrot*1,Fatty Pork*10", "Green Salad1:Cabbage*10,Carrot*2,Pineapple*5", "T-Bone:Carrot*2,Steak Meat*1"] ))  

и для того, чтобы мой код работал, он должен быть таким

 print(extract(recipes = ['T-Bone', 'Green Salad1'], data = {'Pork Stew': {'Cabbage': 5, 'Carrot': 1, 'Fatty Pork': 10}, 'Green Salad1': {'Cabbage': 10, 'Carrot': 2, 'Pineapple': 5},'T-Bone': {'Carrot': 2, 'Steak Meat': 1}}))  

Таким образом, из входных данных данные должны быть изменены с

 data = ["Pork Stew:Cabbage*5,Carrot*1,Fatty Pork*10",  "Green Salad1:Cabbage*10,Carrot*2,Pineapple*5",  "T-Bone:Carrot*2,Steak Meat*1"]  

Для

 data = {'Pork Stew': {'Cabbage': 5, 'Carrot': 1, 'Fatty Pork': 10}, 'Green Salad1': {'Cabbage': 10, 'Carrot': 2, 'Pineapple': 5},'T-Bone': {'Carrot': 2, 'Steak Meat': 1}}  

Комментарии:

1. Пожалуйста, покажите полную обратную связь. Кроме того, добавьте примеры данных и то, как вы вызываете функцию.

2. @Barмар, я уже отредактировал

Ответ №1:

Преобразуйте данные в dict в extract().

 recipes = ['T-Bone', 'Green Salad1']  data = ["Pork Stew:Cabbage*5,Carrot*1,Fatty Pork*10", "Green Salad1:Cabbage*10,Carrot*2,Pineapple*5", "T-Bone:Carrot*2,Steak Meat*1"]   def rdict(recipes):  recipes_splitted = {}  for r in recipes:  recipe_name, parts = r.split(":")  recipe_parts = {}  for part in parts.split(','):  product, number = part.split('*')  recipe_parts[product] = int(number)  recipes_splitted[recipe_name] = recipe_parts  return recipes_splitted   def extract(recipes, data):  data = rdict(data) # convert data to dict first  result = []  for r in recipes:  tmp = []  for key in data[r]:   tmp.append(f"{key}:{data[r][key]}")  final_string = ""  for i in range(len(tmp)):  if i lt; len(tmp) - 1:  final_string  = tmp[i]   ", "  else:  final_string  = tmp[i]  result.append(final_string)  return result  print(extract(recipes, data))  

Выход:

 ['Carrot:2, Steak Meat:1', 'Cabbage:10, Carrot:2, Pineapple:5']  

Комментарии:

1. Большое вам спасибо за ваше объяснение и код 🙂

2. 🙂 это ваш код, я только добавляю data = rdict(data) , что я впечатлен тем, как вы преобразуете текстовый список в диктант.

Ответ №2:

  1. Переименован rdict в parse_recipe и изменен , чтобы вернуть кортеж, который легче и проще в обработке
  2. В выдержке:

    а) Составьте список рецептов: data_recipes

    б) Построенный результат путем получения нужных рецептов, с защитой от пропущенного рецепта (который может быть пустым диктатом: {} )

 def parse_recipe(s):  recipe, ings_s = s.split(':')  ings_l = ings_s.split(',')    ings_d= {}  for ing in ings_l:  i,q = ing.split('*')  ings_d[i.strip()] = q.strip()   return recipe.strip(), ings_d   def extract(recipes, data):  data_recipes = {}  for s in data:  recipe, ings_d = parse_recipe(s)  data_recipes[recipe] = ings_d   return {r: data_recipes.get(r, dict()) for r in recipes}