Loading...
achobanov avatar achobanov -4 Точки

Python programming - лекция 4, задача 2

Задача:

Използвайки кода си от предишната задача, и използвайки същите файлове, намерете средната цена от всички продукти в каталога, групирани по пол и възраст. Използвайте колоната за пол и възраст която има една от следните стойности:

– infant

  • kid
  • men
  • unisex
  • woman

Кратък текст: http://txs.io/MWPb

catalog = input('full or sample catalog? ')
if catalog == 'full':
    address = '/home/alex/Documents/SoftUni/open_courses/python/lecture-4/catalog_full.csv'
else:
    address = '/home/alex/Documents/SoftUni/open_courses/python/lecture-4/catalog_sample.csv'


def get_info(product: str, data: str):
    holder = product.split(',')
    #print(holder)
    if data == 'price':
        return float(holder[6])
    else:
        return holder[5]


highest = 0
highest_dup = 1
lowest = 0
lowest_dup = 1
sum = 0
counter = 0
targets = ['Men', 'Woman', 'Unisex', 'Kid', 'Infant']
line_num = 0
with open(address) as catalog:
    for target in range(5):
        for line in catalog:
            print(line_num)
            gender = get_info(catalog.readline(), 'target')
            #print(gender)
            if gender == targets[target]:
                price = get_info(catalog.readline(), 'price')
                # Refmoving the minimal and maximal values ( because why not )
                if highest == 0 or lowest == 0:
                    highest = price
                    lowest = price
                elif price > highest:
                    highest = price
                    highest_dup = 1
                elif price < lowest:
                    lowest = price
                    lowest_dup = 1
                elif price == highest:
                    highest_dup += 1
                elif price == lowest:
                    lowest_dup += 1

                sum += price
                counter += 1
            line_num += 1

        print('{0:.2f}'.format((sum - highest_dup * highest - lowest_dup * lowest) / counter))


Като въведа 'full' работи. Тоест показва някакви стойности. Тези стойности обаче са подозрително еднакви (?). Също така, това аз виждам в конзолата ( защото съм въвел един тестов принт на номера на реда, през който итерирам в момента ) е 30567, при положение, че файлът има 61134 ( пак подозрително, това което виждам са точно половината редове ). Това може да е и от Pycharm, защото когато пробвам в интерактивната конзола на python си изписва всичките 61134. С две думи казано, не съм сигурен дали работи на 100%.

Същинския проблем, обаче се случва когато въведа нещо друго, тоест когато се опитам да работя с catalog_sample.csv. 

Traceback (most recent call last):
  File "/home/alex/Documents/SoftUni/open_courses/python/lecture-4/3.py", line 29, in <module>
    gender = get_info(catalog.readline(), 'target')
  File "/home/alex/Documents/SoftUni/open_courses/python/lecture-4/3.py", line 14, in get_info
    return holder[5]
IndexError: list index out of range

Ей това не го разбирам. В началото имах подобен проблем, защото файла не беше наред. Използваше "," за десетични делители освен за разделянето на различните типове информация. След като редактирах файловете нещата се оправиха, но явно не съвсем.

Тагове:
0
Open Courses
supersane avatar supersane 234 Точки

Поразгледах ти кода, и това, което виждам за сега е може би, че всеки път, когато викаш функцията get_info, като параметър и подаваш catalog.readline(), което ако не се лъжа ти връща реда на който се намира в момента и се отмества на следващия. Следователно за една итерация от цикъла ти прочиташ 2 реда, и сигурно затова виждаш 2 пъти по-малко прочетени линии. Виж дали е от това и кажи какво е станало.

0
achobanov avatar achobanov -4 Точки

Явно това се случва, благодаря. Това което всъщност трябва да се направи е за да подам реда като стринг параметър на функцията е:

with open(address) as f:
    for line in f:
        print(line_num)
        line_num += 1
        price = get_info(line)

Така си итерирам през целия файл. Освен това другият проблем беше с мястото на for цикъла за всеки отделен тип:

# Грешно
with open(address) as catalog:
    for target in range(5):
        for line in catalog:

# Вярно
for target in range(5):
    with open(address) as catalog:
        for line in catalog:

Трябва за всяка следваща итерация на целия файл да го отварям наново, иначе програмата си минава редовете през първия target цикъл и после само ми принтира същите сотйности отново.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.