Първа задача

  1. Може да погледнете условието на първа задача. В хранилището има и примерен тест -- просто запазете вашето решение в същата директория като solution.py и изпълнете теста с python sample_test.py.

    До няколко дни ще добавим функционалност за предаване на решения.

    Ако имате въпроси, моля задавайте тук.

    Публикувано преди
  2. Не разбрах какво трябва да прави функцията unique_objects и какво трябва да извежда. Може ли малко повече разяснения?

    Иначе другите ги направих.

    Публикувано преди
  3. Идеята е да върнеш като число броя на обектите, а не на референциите към обект, във въпросния списък.

    Публикувано преди
  4. Имам още един въпрос: Ако за make_multiset въведем списък, който има елементи, които не се кешират (например друг списък), какво да прави. Трябва ли да прави някаква проверка, да ги пропуска тези елементи или да оставим Python да се оправя сам.

    И как мога да проверя със сигруност дали някой обект може да се хишира?

    Публикувано преди
  5. Съжалявам, веднъж написа "хишира", веднъж -- "кешират". Можеш ли да пробваш пак?

    Публикувано преди
  6. My bad. Имах в предвид "хишира" - от hash. Интерсува ме как да знам дали речника може да взима дадения обект като ключ.

    Например, ако имам списъка [1, 2, 3, 'a', 'b',] всичко е OK, но ако списъка е например [1, 2, 3, 'a', 'b', [],] Python ще гърми. Идеята ми е някакси да се проверява дали даден обект може да е ключ или не и ако не е да се пропуска и да продължи с останалите елементи.

    Публикувано преди
  7. Използването на locals()["_[1]"] в List Comprehension счита ли се за лоша практика? Не че съм го ползвал в решението, но попаднах на него докато търсих разни неща.

    (Edit: Не работи в Python3.2)

    Публикувано преди
  8. @Евгений, технически погледнато е възможно да се хваща ексепшън при грешки(но не сме говорили за тях, та не го обмисляйте като вариант) или да се използва collections модула.

    Например:

    >>> import collections
    >>> isinstance({}, collections.Hashable)
    False
    >>> isinstance([], collections.Hashable)
    False
    >>> isinstance(42, collections.Hashable)
    True
    >>> isinstance('Lorem ipsum dolor sit amet', collections.Hashable)
    True
    >>> 

    Но да кажем, че няма да сме толкова дребнави :)

    Публикувано преди
  9. @Кирил: Казва се "изключение", не "ексепшън"

    @Евгений: "Хишира" пловдивска версия на "хешира" ли е, майна? :) И понеже Кирил въобще не ти отговори на въпроса:

    Каквото искате, ние няма да проверяваме за това. Аз лично бих оставил Python да вдигне грешка.

    @Станко: Какво прави locals()["_[1]"] и какво е LC?

    P.S.: Може да комбинирате и двете в едно и да му викате "иксйепшън".

    Публикувано преди
  10. Сега видях, че не работи в Python 3.2, но все пак:

    "Sometimes you want to have a list comprehension refer to itself, but you can't because it isn't bound to a name until after it is fully constructed. However, the interpreter creates a secret name that only exists while the list is being built. That name is (usually) "_[1]", and it refers to the bound method "append" of the list. This is our back door to get at the list object itself."

    Цитата е от: http://code.activestate.com/recipes/204297-the-secret-name-of-list-comprehensions/

    Още: http://techblog.ironfroggy.com/2007/09/how-to-add-memory-leaks-to-python.html

    Публикувано преди
  11. Тая селяния не я знаех. Яко.

    Предвид, че не работи -- не, не го ползвайте. Ако работеше -- пак ви съветвам да минете без него. Кодът ще е по-дълъг, но по-разбираем.

    Публикувано преди
  12. @Кирил и Стефан: Мерси за инфото.

    @Стефан only: Аз пък какво общо имам с Пловдив? И освен това той ми отговори на въпроса. Поне половината...

    
    
    
    

    Иначе аз не използвам try...except, а само това, което сме учили: if, type() и !=. Проверката изглежда ето така:

    if type(l) != list:
        print('The function parameter must be a list!')
        print(type(l))
        return None

    Според мен е доста хитро. Но надали е по-добро решение от try...except.

    Забележете, че се връща None. Т.е. после в програмата може да се лови дали върнатата стойност е None. Ако е None - значи има проблем, ако е нещо друго, значи всичко е минало добре (•Програмиста стиска палци!•).

    Публикувано преди
    1. По-добре е да породиш изключение -- връщането на стойности за грешка е толкова C.
    2. По-добре е въобще да не се занимаваш с такава проверка. (1) Не е нужно и (2) така чупиш duck typing. Защо да не работи за tuple, map и прочее?
    3. isinstance(l, list) е по-добре от type(l) != list
    Публикувано преди
    1. Старите навици трудно се изкореняват. Уча c++ още от гимназията. Надявам се, че ще ми избиеш глупостите от главата. :)
    2. Това въпросително изречение не го разбрах: "Защо да не работи за tuple, map и прочее?"
    3. Сега ще го пробвам, сега ще го пробвам, сега ще го пробвам... (•Отива да тормози компютъра•)
    Публикувано преди
  13. Ако просто си напишеш кода, без да те интересува дали получава списък, или map или tuple, ще е по-добре, отколкото да "извеждаш грешка" при тип, различен от списък.

    Публикувано преди
  14. Така, имам въпрос към unique_objects:

    Ако подадем unique_objects([[1], [2]]) какво трябва да върне? 2 или 3?


    А ако е unique_objects([1, 'a'])? При мен ми дава грешка, защото първо се опитвам да сортирам списъка, а Python не ще да сортира числа и стрингове едновременно. Може ли това да се заобиколи или трябва да търся друг начин?

    Публикувано преди
  15. Трябва да върне 2.

    А можеш ли да се аргументираш защо изобщо сортираш нещата в списъка?

    Публикувано преди
  16. Логиката е такава. Сортирам списъка. След това проверявам съседните елементи дали са равни (с is!)

    Иначе, ако не е сортиран, ще трябва да правя един куп обхождания - от началото на списъка до сегашния елемент, който разглеждам. И със следващия елемент е пак същото.

    Според мен така става най-малкото грозно и по-трудно четимо и разбираемо.




    Разбира се може да има и трети метод, който да е по-бърз, ама още не съм се сетил за него.

    Публикувано преди
  17. Защо не ги блъскаш в Set и само извеждаш len() от сет-а ?

    Публикувано преди
  18. Set-ът иска hash :) Единият пример за тестване го чупи :)

    Публикувано преди
  19. Може, аз така съм го направил :) Тествам с всичко и става (list,dict,...) няма никакъв проблем :) В момента е малко нечестно да пост-на сорс затова по-късно :)

    Публикувано преди
  20. "Защо не ги блъскаш в Set и само извеждаш len() от сет-а ?"

    И аз това си помислих, когато видях условието. ;) Работи идеално. Със сегашните си знания не виждам по-добра алтернатива. :)

    П.П. "Set-ът иска hash :) Единият пример за тестване го чупи :)" :? Интересно, ще си ги тествам с примерите.

    Публикувано преди
  21. Може и без set ( не разбирам при вас как не вдига грешка при list и т.н. ( освен ако не правите проверка, но пък трябва после да сравните и тия дето не сте вкарали в set-а... знам ли...) ) и то на един ред.

    Публикувано преди
  22. Ахааа, разбрах какво имаш предвид. Например ако имаме: set([1,2,[1,5]]) Дава грешка, че не може да го cast-не до set, тъй като [1,5] не е hashable. ;) Дам, това прецаква нещата, но пък все ще се измисли нещо...по-късно. Успех. :)

    П.С. Като мине срока за това домашно ще пейстна малко интересен код. :)

    Публикувано преди
  23. Няма да си единствен с постването на интересен код. :) :D

    За жалост вероятно няма да е веднага след лекцията. Следващата седмица няма да ме има в София, така че ще се наложи да пропусна Python-а. А и не се знае дали ще имам връзка с Интернета. :(

    Публикувано преди
  24. Подсказка:

    help(id)

    П.П.: Хора, не пълнете темата със скучни подробности от личния си живот (например къде сте следващата седмица) и тон подобни глупости. Нека се ограничим с въпроси по задачата и техните отговори. В този курс сте стотина човека и не може да очаквате всички да четат къде няма да бъдете след седем дни.

    Публикувано преди
  25. Всъщност в последния абзац на предишния ми пост имаше два скрити въпроса: 1) Кога ще можем да качваме готовия код? 2) От кога до кога ще е следващата задача за домашно?

    Публикувано преди
  26. Да можем да си дефинираме клас на който да предефинираме(съжелвам ако не е така терминът) __hash__ метода - което ще ни позволи да хешираме всичко и да го блъскаме в сет-а;

    Пример:

    def __hash__(self):
        return hash(self.__str__())
    Публикувано преди
  27. Подсказката на Стефан беше адски полезна и напълно достатъчна. Това с класовете предлагам да го оставим за след няколко седмици. :P

    Предвид това, че ми се струва, че функцията, която си написал е равнозначна на hash(str(x)), където x е list,( ако съм в грешка моля да ме извиниш), може и да стане дори и без дефиниране на класове и override-ване (както казах - с hash(str(x))). Най-вероятно ще се получи, тъй като:

    >>> a=[1,2,3,4]
    >>> b=[1,2,3,4]
    >>> a is b
    False
    >>> hash(str(a)) is hash(str(b))
    False

    Т.е. хешовете на равни по "стойност", но различни обекти са също равни по стойност, но различни обекти. И съответно един сет x=(hash(str(a)),hash(str(b)) би имал len() 2. :)

    Публикувано преди
  28. Само че...

    >>> a = [1,2,3]
    >>> str(a)
    '[1, 2, 3]'
    >>> hash(str(a)) is hash(str(a))
    False

    И което всъщност ми е по-интересно как се получава при положение, че за кратки стрингове се преизползват обекти:

    >>> str(a) is str(a)
    False

    Иначе определено, за хората, които не са се сетили за едноредовото решение, а ги човърка отвътре, подсказката на Стефан е изключително ценна :)

    Публикувано преди
  29. Wow, доста подмолно, нямаше да го забележа. Това за стринговете също е странно. Чакам с нетърпение някой да обясни, тъй като аз не намерих отговора. :)

    Публикувано преди

Трябва да сте влезли в системата, за да може да отговаряте на теми.