Форум сайта python.su
0
Добрый день, уважаемые форумчане!
Прошу помочь решить задачу, никак сообразить не могу. Суть задачи в следующем:
Определить самый дешевый продукт и в каком магазине он продается. Название продукта следует записать в первой строке, а название магазина - во второй. Если несколько товаров стоят одинаково, то выведите то название, которое раньше в алфавитном порядке. Если этот товар продается в нескольких магазинах по одной минимальной цене, то выведите минимальное в алфавитном порядке название магазина.
Задачу нужно решить без использования специальных библиотек для работы с табличными данными.
Сам файл в csv формате и разделителем выступает точка с запятой.
Сейчас на таком этапе:
with open("C:\\Users\\Windows 10\\Desktop\\problem5.csv", 'r', encoding='utf8') as fh: text = fh.read() #def getMinIndex(seq): # minIndex = 0 # for i, x in enumerate(seq): # if x < seq[minIndex]: # minIndex = i # return minIndex #for i,j in shops_and_prices: # result = [min(p) for p in zip(j)] def strings_to_num(price): return [int(s) for s in price] data = list(map(lambda s: s.split(';'), text.splitlines())) product = data[0][1:] shops_and_prices = [(row[0], strings_to_num(row[1:])) for row in data[1:]] best_row = min(shops_and_prices, key=lambda shop_and_price: shop_and_price[1]) best_shop, best_prices = best_row for products in zip(product, best_prices): print('{} {}'.format(*products) + ' ' + best_shop)
Отредактировано terott (Апрель 26, 2020 00:27:17)
Прикреплённый файлы:
problem5.csv (1,1 KБ)
Офлайн
76
with open('problem5.csv', 'r', encoding='utf8') as fh: text = fh.read() name_shop = list(map(lambda s: s.split(';')[0], text.splitlines()[1:])) name_product = text.splitlines()[0].split(';')[1:] data = list(map(lambda s: s.split(';')[1:], text.splitlines()[1:])) product = data shops_and_prices = [(num, list(map(int, row))) for num, row in enumerate(data, start=1)] best_row = min(shops_and_prices, key=lambda shop_and_price: min(shop_and_price[1], key=lambda val: val)) best_price = min(best_row[1]) res = [(rows[0], num) for rows in shops_and_prices if best_price in rows[1] for num, price in enumerate(rows[1], start=1) if price == best_price] for num_shop, num_product in res: print('{} - {}'.format(name_shop[num_shop - 1], name_product[num_product - 1]) + ' - ', best_price)
Отредактировано Romissevd (Апрель 25, 2020 23:39:18)
Офлайн
0
Огромнейшее Вам спасибо, Вы гений!!!
Офлайн
857
terottВсё-таки надо модуль csv использовать. CSV-формат - это не просто “разделитель точка с запятой”, он гораздо сложнее устроен.
Задачу нужно решить без использования специальных библиотек для работы с табличными данными.
Сам файл в csv формате и разделителем выступает точка с запятой.
terottТы её пытаешься решить сразу целиком, а надо решать её по частям. Сначала тебе нужно перегнать данные из файла в данные в виде структур данных питона. Для этого тебе нужно написать отдельную функцию. Затем, когда всё будет готово, тебе нужно данные в виде структур данных питона перегнать в удобные данные в виде структур данных питона. Для этого тебе нужно написать отдельную функцию. Затем, когда всё будет готово, тебе нужно удобные данные в виде структур данных питона отсортировать. Для этого тебе нужно написать отдельную функцию. Затем, когда всё будет готово, тебе нужно отсортированные данные в виде структур данных питона перегнать в удобные данные для вывода на экран в виде структур данных питона. Для этого тебе нужно написать отдельную функцию. Затем тебе надо вывести удобные данные для вывода на экран в виде структур данных питона на экран пользователю. Для этого тебе нужно написать отдельную функцию. Затем, когда всё будет готово, тебе нужно запустить все эти функции, передавая по цепочке данные из одной функции в другую. Всё.
Знаю, что решаю её не правильно, но пока сообразить не могу как сравнить все списки с ценами и вытащить минимальные вместе с магазином к товару.
Думал на счет сравнения всех списков и вытягивания только минимальных, но тоже пока не получается(
Отредактировано py.user.next (Апрель 26, 2020 05:00:00)
Офлайн