Работа со словарями
Не могу доработать код. Нужно организовать работу с файлом, содержащим следующие сведения об игрушках: код, наименование, фирма-производитель, возрастное назначение, цена. Поиск осуществлять по следующим параметрам:
- название;
- фирма-производитель и возрастное назначение (диапазон);
- название, при этом определить игрушку с минимальной ценой и с максимальной.
R = dict()
code = input("Введите код товара: ")
name = input("Введите наименование товара: ")
firm = input("Введите фирму-производитель: ")
age = input("Введите возрастное ограничение: ")
price = input("Введите стоимость: ")
R [k] = (code, name, firm, age, price)
for k in range(N):
if d in R [k] : print(R[k])
f = open ('terxt.txt','w') #Запись файла
for k in R:
f.write(str(k),+'\n')
f.close()
Q=dict()
for line in f:
Q[k] = line [:-1]
Код явно неправильный и требует доработок. Прошу помочь чем кто может. Являюсь новичком, поэтому многого могу не понимать. Заранее спасибо!
Ответы (4 шт):
Вам лучше подойдет класс. Вот пример программы:
class Toy:
def __init__(self, code,name,firm,age,price):
self.code=code
self.name=name
self.firm=firm
self.age=age
self.price=price
def __str__(self):
return str(self.code)+' Название: '+self.name+' Фирма: '+self.firm+' Возраст: '+str(self.age)+' Цена: '+str(self.price)
def getName(self):
return self.name
def getCode(self):
return self.code
def getFirm(self):
return self.firm
def getAge(self):
return self.age
def getPrice(self):
return self.price
def readToys(filename):
f=open(filename, "r")
res=[]
for line in f:
values=line.split(';')
toy=Toy(int(values[0]),values[1],values[2],int(values[3]),int(values[4]))
res.append(toy)
return(res)
def searchName(toys,name):
flag=0
for toy in toys:
if toy.getName()==name:
print(toy)
flag=1
if flag==0:
print('Товаров не найдено')
def searchFirmAge(toys,firm,a,b):
flag=0
for toy in toys:
if toy.getFirm()==firm and toy.getAge()>=a and toy.getAge()<=b:
print(toy)
flag=1
if flag==0:
print('Товаров не найдено')
def searchMaxName(toys,name):
flag=0
for toy in toys:
if toy.getName()==name:
if flag==0:
tmax=toys[0]
tmin=toys[0]
flag=1
else:
if tmax.getPrice()<toy.getPrice():
tmax=toy
if tmin.getPrice()>toy.getPrice():
tmin=toy
if flag==0:
print('Товаров не найдено')
else:
print('Максимальная цена: ',tmax)
print('Минимальная цена: ',tmin)
toys=readToys("in.txt")
state=-1
while state!=0:
print("[1] - Поиск по названию")
print("[2] - Поиск по фирме и диапазону возрастов")
print("[3] - Минимальная и максимальная цена с одинаковым названием")
print("[0] - Выход")
state=int(input("Выбор: "))
if state==1:
name=input("Введите имя: ")
searchName(toys,name)
if state==2:
firm=input("Введите фирму: ")
min_age=int(input("Минимальный возраст: "))
max_age=int(input("Максимальный возраст: "))
searchFirmAge(toys,firm,min_age,max_age)
if state==3:
name=input("Введите имя: ")
searchMaxName(toys,name)
Входной файл in.txt
1;Игрушка1;Фирма1;5;300
2;Игрушка2;Фирма2;6;301
3;Игрушка3;Фирма3;7;302
4;Игрушка4;Фирма2;8;302
5;Игрушка5;Фирма5;5;304
6;Игрушка6;Фирма6;6;302
7;Игрушка7;Фирма7;7;310
8;Игрушка8;Фирма2;8;311
9;Игрушка1;Фирма3;5;3200
10;Игрушка2;Фирма3;6;400
11;Игрушка2;Фирма2;7;500
12;Игрушка2;Фирма3;8;600
13;Игрушка3;Фирма3;5;700
14;Игрушка4;Фирма6;6;800
15;Игрушка5;Фирма7;7;900
16;Игрушка6;Фирма2;8;300
17;Игрушка7;Фирма3;5;302
Думаю эту задачу надо решать с помощью json
Спасибо вам за задачу, так как в первый раз серьёзно посидел и немного подтянул json
Модули используются встроенные ( ничего устанавливать не надо ).
Но надо доработать программу, чтоб выводились все данные с одинаковой ценой или возрастом, а не первые, на которые наткнулась программа.
Так же чтоб у вас все работало нужно сначала через редактор кода добавить в код create_new_file() перед тем как начинается клиентский код. затем активируйте программу и прервите её выполнения введя рандомное число больше 8. Потом уберите строчку create_new_file() из кода, чтоб данные которые вы добавите не стирались.
Как дописывать информацию в json файл на python
import json
from pathlib import Path
def create_new_file():
"""
перезаписывает файл. т.е вызвав эту функцию все данные которые были в списках обнулятся.
"""
data = {
'code': [],
'name': [],
'firm': [],
'age': [],
'price': []
}
with open('data_file.json', 'w+') as write_file:
json.dump(data, write_file)
def add_data():
"""
Добавить данные
"""
code_input = int(input('code: '))
name_input = str(input('name: '))
firm_input = str(input('firm: '))
age_input = int(input('age: '))
price_input = float(input('price: '))
path = Path('data_file.json')
json_data = json.loads(path.read_text(encoding='utf-8'))
json_data['code'].append(code_input)
json_data['name'].append(name_input)
json_data['firm'].append(firm_input)
json_data['age'].append(age_input)
json_data['price'].append(price_input)
path.write_text(json.dumps(json_data), encoding='utf-8')
def find_by_code():
code_value = int(input("type code and we'll show you all the toys with current code.. "))
# ВЫГРУЖАЕМ ДАННЫЕ ИЗ JSON ФАЙЛА
path = Path('data_file.json')
json_data = json.loads(path.read_text(encoding='utf-8'))
code_list = json_data['code']
cur_index = code_list.index(code_value)
return ' code = {}\n name = {}\n firm = {}\n age = {}\n price = {}'.format(json_data['code'][cur_index],
json_data['name'][cur_index],
json_data['firm'][cur_index],
json_data['age'][cur_index],
json_data['price'][cur_index])
def find_by_name():
name_value = str(input("type name and we'll show you all the toys with current name.. "))
# ВЫГРУЖАЕМ ДАННЫЕ ИЗ JSON ФАЙЛА
path = Path('data_file.json')
json_data = json.loads(path.read_text(encoding='utf-8'))
name_list = json_data['name']
cur_index = name_list.index(name_value)
return ' code = {}\n name = {}\n firm = {}\n age = {}\n price = {}'.format(json_data['code'][cur_index],
json_data['name'][cur_index],
json_data['firm'][cur_index],
json_data['age'][cur_index],
json_data['price'][cur_index])
def find_by_firm():
firm_value = str(input("type firm and we'll show you all the toys with current firm.. "))
# ВЫГРУЖАЕМ ДАННЫЕ ИЗ JSON ФАЙЛА
path = Path('data_file.json')
json_data = json.loads(path.read_text(encoding='utf-8'))
firm_list = json_data['firm']
cur_index = firm_list.index(firm_value)
return ' code = {}\n name = {}\n firm = {}\n age = {}\n price = {}'.format(json_data['code'][cur_index],
json_data['name'][cur_index],
json_data['firm'][cur_index],
json_data['age'][cur_index],
json_data['price'][cur_index])
def find_by_age():
age_value = int(input("type age and we'll show you all the toys with current age.. "))
# ВЫГРУЖАЕМ ДАННЫЕ ИЗ JSON ФАЙЛА
path = Path('data_file.json')
json_data = json.loads(path.read_text(encoding='utf-8'))
age_list = json_data['age']
cur_index = age_list.index(age_value)
return ' code = {}\n name = {}\n firm = {}\n age = {}\n price = {}'.format(json_data['code'][cur_index],
json_data['name'][cur_index],
json_data['firm'][cur_index],
json_data['age'][cur_index],
json_data['price'][cur_index])
def find_by_price():
price_value = float(input("type price and we'll show you all the toys with current price.. "))
# ВЫГРУЖАЕМ ДАННЫЕ ИЗ JSON ФАЙЛА
path = Path('data_file.json')
json_data = json.loads(path.read_text(encoding='utf-8'))
price_list = json_data['price']
cur_index = price_list.index(price_value)
return ' code = {}\n name = {}\n firm = {}\n age = {}\n price = {}'.format(json_data['code'][cur_index],
json_data['name'][cur_index],
json_data['firm'][cur_index],
json_data['age'][cur_index],
json_data['price'][cur_index])
def find_the_cheapest():
# ВЫГРУЖАЕМ ДАННЫЕ ИЗ JSON ФАЙЛА
path = Path('data_file.json')
json_data = json.loads(path.read_text(encoding='utf-8'))
price_list = json_data['price']
min_price = min(price_list) # Узнать минимальную цену
cur_index = price_list.index(min_price) # Индекс элемента с минимальной ценой
return ' code = {}\n name = {}\n firm = {}\n age = {}\n price = {}'.format(json_data['code'][cur_index],
json_data['name'][cur_index],
json_data['firm'][cur_index],
json_data['age'][cur_index],
json_data['price'][cur_index])
def find_the_most_expensive():
# ВЫГРУЖАЕМ ДАННЫЕ ИЗ JSON ФАЙЛА
path = Path('data_file.json')
json_data = json.loads(path.read_text(encoding='utf-8'))
price_list = json_data['price']
max_price = max(price_list) # Узнать максимальную цену
cur_index = price_list.index(max_price) # Индекс элемента с максимальной ценой
return ' code = {}\n name = {}\n firm = {}\n age = {}\n price = {}'.format(json_data['code'][cur_index],
json_data['name'][cur_index],
json_data['firm'][cur_index],
json_data['age'][cur_index],
json_data['price'][cur_index])
# ==============
# Клиентский код
# ==============
print('Hello BigBoss!')
def print_start():
print('\n\nEnter 1 to add new toys')
print('Enter 2 to find by code')
print('Enter 3 to find by name')
print('Enter 4 to find by firm')
print('Enter 5 to find by age')
print('Enter 6 to find by price')
print('Enter 7 to find The Cheapest Toy')
print('Enter 8 to find The Most Expensive One')
print('If You Wanna Leave Enter Anything else')
print_start()
choice = int(input('\nSo What You Gonna Do? '))
while choice == 1 or choice == 2 or choice == 3 or choice == 4 or choice == 5 or choice == 6 or choice == 7 or choice == 8:
if choice == 1:
add_data()
print_start()
choice = int(input('\nSo What You Gonna Do? '))
if choice == 2:
print(find_by_code())
print_start()
choice = int(input('\nSo What You Gonna Do? '))
if choice == 3:
print(find_by_name())
print_start()
choice = int(input('\nSo What You Gonna Do? '))
if choice == 4:
print(find_by_firm())
print_start()
choice = int(input('\nSo What You Gonna Do? '))
if choice == 5:
print(find_by_age())
print_start()
choice = int(input('\nSo What You Gonna Do? '))
if choice == 6:
print(find_by_price())
print_start()
choice = int(input('\nSo What You Gonna Do? '))
if choice == 7:
print(find_the_cheapest())
print_start()
choice = int(input('\nSo What You Gonna Do? '))
if choice == 8:
print(find_the_most_expensive())
print_start()
choice = int(input('\nSo What You Gonna Do? '))
else:
print('See You Latter Boss!')
Тебе следует разбить задачу на составные части.
Во первых, тебе нужно смоделировать, какие данные ты хочешь получить. Ты это уже сделал. Тебе нужны: код товара, наименование товара, возрастное ограничение, фирма производитель и стоимость. Теперь можешь представить, что ты составляешь табличку, и перечисленные названия - это колонки в табличке. Можно создать переменную с именами колонок.
field_names = ['age', 'code', 'name', 'firm', 'price'] # порядок можешь выбрать сам
Во вторых, необходимо собрать информацию об игрушках из стандартного ввода(функция input). Здесь можно подумать о количестве вводимых игрушек. Сколько игрушек должно поступить в твою программу? Можешь спросить об этом у пользователя.
n = int(input("Введите количество игрушек: ")) # преобразуем в число
Теперь ты должен определиться куда эти игрушки нужно складывать. Ты упомянул, что задачу нужно решить на словарях, ну что ж, это вполне подходящая структура. Создаешь переменную toys и устанавливаешь ее списком. Она будет хранить в себе словари с введенными данными.
toys = []
В цикле спрашиваешь всю необходимую информацию у пользователя, столько раз, сколько было введено в переменной n.
for i in range(n):
toy = {}
toy['code'] = input("Введите код товара: ")
toy['name'] = input("Введите наименование товара: ")
toy['firm'] = input("Введите фирму-производитель: ")
toy['age'] = input("Введите возрастное ограничение: ")
toy['price'] = int(input("Введите стоимость: ")) # преобразуем в число
toys.append(toy)
Теперь, когда информация собрана, нужно записать данные в табличку. Для этого подойдет модуль csv встроенный в питон Его нужно сначала импортировать
import csv
Открываешь файл на запись:
with open('toys.csv', 'w') as f:
writer = csv.DictWriter(f, delimiter=',', fieldnames=field_names)
writer.writeheader() # Запись названий столбцов
writer.writerows(toys) # запись всех данных из списка словарей
Минимальное и максимальное значение цены я думаю ты и сам сможешь посчитать. Удачи!
#Pavlov Ivan ISPspk-218 Lab 4 Variant 10
slovar = dict()
f = open("text.txt", 'r',encoding="utf-8")
for line in f :
k = line[:6]
line = line[7:]
slovar[k] = line
f.close()
for el in slovar:
print(slovar[el],end='')
m = 1
print("\nДобро пожаловать в магазин игрушек 'PavlovToys'!")
while m != 0 :
print(
"""
Магазин игрушек
0 - Выход
1 - Список всех фирм-производителей
2 - Поиск товара по фирме-производителю
3 - Поиск товара по наименованию товара и диапазону цены
"""
)
m = int(input())
if m == 1:
k = 0
for el in slovar:
p = slovar[el].find('/')
firm = slovar[el][p+1:]
p = firm.find('/')
firm = firm[:p]
k +=1
print(k,firm)
elif m == 2:
f_P = input('Введите фирму-поставщика')
k = 0
for el in slovar:
p = slovar[el].find('/')
firm = slovar[el][p+1:]
p = firm.find('/')
firm = firm[:p]
if firm.find(f_P) != -1 :
k += 1
print(k,slovar[el])
if k == 0 : print('Такого поставщика не нашли!')
elif m == 3 :
n_T = input('Введите наименование товара ')
min_Z = float(input('Введите нижнюю границу цены '))
max_Z = float(input('Введите верхнюю границу цены '))
k = 0
for el in slovar:
line = slovar[el][:]
p = line.find('/')
tovar = line[:p]
line = line[p+1:]
p = line.find('/')
line = line[p+1:]
p = line.find('/')
zena = float(line[:p])
if (tovar.find(n_T) != -1) and ( min_Z< zena < max_Z):
k += 1
print(k,slovar[el])
if k == 0 : print('Такой записи не нашли!')
elif m == 0:
input('\n\nНажмите Enter для выхода')
else:
print('Пожалуйста, выберите 1 из пунктов:')