Решения на първа задача

  1. Публикувахме решенията на първа задача.

    Резултатите би трябвало да са очевидни. Можете да намерите себе си в списъка и да видите какво се е случило. Погледене лога за подробности, ако някои от тестовете ви не минават. Може да разгледате чуждите решения за сравнение.

    Все още не сме дали бонус точки за готино решение. Скоро ще го направим. Stay tuned.

    Някои от вас са предали синтактично невалиден Python и в резултат имат 0 точки. Ще ви оправя синтаксиса и ще оценя задачите ви малко по-късно. Искам да ви дам малко време да обърнете внимание на това. В бъдеще ако предадете невалиден код, няма да си играем да го оправяме. Пишете си кода някъде другаде и го paste-вайте. Не ползвайте полето като редактор.

    Може да намерите условие, тестове и нашите решения в GitHub.

    Ако имате въпроси -- питайте.

    Публикувано преди
  2. Въпрос?

    Ето моята втора за задача:

    def ordered_dict(dict_val):
        res=list(dict_val.items())
        return res
    

    функцията ми fail-ва на някой от тестовете и това не го оспорвам.Обаче работи за ключове,който са малки число до 999999 включително.

    _________________________________________________________
    >>>ordered_dict({1:'i',2.0:'ii',999999:'what,what?'})
    
    [(1, 'i'), (2.0, 'ii'), (999999, 'what,what?')] # работи
    __________________________________________________________
    
    >>> ordered_dict({1:'i',2.0:'ii',1000000:'what,what?'})
    
    [(1000000, 'what,what?'), (1, 'i'), (2.0, 'ii')] # FAIL
    ___________________________________________________________
    

    Защо става така?

    Публикувано преди
  3. Нито dict.items(), нито list() гарантират каквото и да е подреждане. dict.items() връща елементите на речника в "някакъв" ред - обикновено в реда, в който е най-лесно да бъде обходен речникът вътрешно. Как се обхожда речникът зависи изцяло от вътрешната му реализация - ако е с хеш-таблица (което е много вероятно) или някакъв друг вид подобна структура, вероятно най-лесният начин на обхождане ще мине през всички buckets на хеш-таблицата и ще върне елементите в реда, в който са се разположили из bucket-ите. Тогава всичко зависи от това каква хеш-функция се използва, за да определи кой елемент в кой bucket да попадне.

    Е, така се е получило, че твоята реализация на Python използва хеш-функция и организация на хеш-таблица (или нещо друго, някакъв друг начин, по който е реализиран речникът), която слага малки числа в bucket-и, отговарящи на числото - и след това обхожда bucket-ите в този ред... може би. Тогава елементът с ключ 1 може да попадне в първи bucket, този с ключ 2 - във втори и т.н. - само че в един момент се оказва, че нямаме чак толкова много bucket-и и елементът с ключ 1000000 попада в някой друг. Може и изобщо да не е това - може да минава някакво хеширане или Ерис знае какво - в крайна сметка някак се оказва така, че използването на малки числа за ключове слага елементите в "горе-долу така подредени" bucket-и.

    Но като цяло, на това изобщо и по никакъв начин не можеш да разчиташ - изрично навсякъде се казва, че dict.items() ще върне елементите в неизвестно какъв ред, като единствената гаранция е, че dict.keys(), dict.values() и dict.items() обхождат речника в един и същи ред (ако речникът не е бил променян междувременно).

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

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