#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:
- Переименован
rdict
вparse_recipe
и изменен , чтобы вернуть кортеж, который легче и проще в обработке - В выдержке:
а) Составьте список рецептов:
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}