• Как поставить точку в предложении?

    @Norkotik
    If not val.endswith("."):
    val += "."
    Ответ написан
    Комментировать
  • Как поставить точку в предложении?

    LazyTalent
    @LazyTalent
    Data Engineer, Freelancer
    >>> def correct_sentence(text: str) -> str:
    ...     text = text.capitalize()
    ...     if text.endswith('.'):
    ...             return text
    ...     return '{}.'.format(text)
    ... 
    >>> print(correct_sentence('greetings, friends'))    
    Greetings, friends.
    >>> print(correct_sentence('greetings, friends.'))
    Greetings, friends.
    Ответ написан
    Комментировать
  • Как поставить точку в предложении?

    @deniz1983
    ...
    Там не [-1:], а просто [-1] попробуйте
    Ответ написан
    Комментировать
  • Возможно ли указать тип?

    longclaps
    @longclaps
    зачем существует
    Для удобства программиста

    в какой конкретно реализации она используется
    Pycharm современных версий использует, даёт хинты.
    Ответ написан
    Комментировать
  • Почему меняется аргумент функции?

    Смысл в том, что когда ты в первом случае передаёшь список в функцию, ты передаёшь ссылку на него, и функция изменяет массив с помощью его методов. А когда ты, к примеру, передаёшь число, передаётся именно число, а не ссылка на число и поэтому число ты меняешь только внутри функции.
    P. S. Если хочешь, чтобы "аргумент" не менялся, то делай новый массив из старого:
    def func(arr):
        arr = arr[:]
        print(arr)
        arr.append(1)
    
    arr_ = [0,0,0]
    print('arr_', arr_)
    func(arr_)
    print('arr_', arr_)
    Ответ написан
    1 комментарий
  • Почему False аналогично 0?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    Особенность реализации, булев тип (bool) наследуется от целочисленного (int).

    Если требуется отличать False от 0 и True от 1 -- используйте оператор is вместо !=.

    Операторы == и != проверяют равенство значений двух объектов. Но из-за особенностей реализации, у False и 0 -- одно и тоже значение, а у True и 1 -- одно и тоже другое значение.

    Оператор is проверяет равенство id двух объектов. Булевы объекты True и False -- это синглтоны, т.е. существуют в программе не более, чем в 1 экземпляре. Поэтому, у всех True -- один и тот же id, а у всех Fasle -- один и тот же другой id.
    Ответ написан
    3 комментария
  • Почему False аналогично 0?

    @BJlaDuMup
    if not x is 0
    print(0 == False) # True
    print(0 is False) # False

    is вернет True если две переменные указывают на один и тот же объект, == если объекты, на которые ссылаются переменные, равны.
    Ответ написан
    Комментировать
  • Нужно ли умножать сложности?

    Если я правильно понимаю, то reversed будет только один раз. Псевдокодом можно записать это так:

    newStr = reversed(string);
    for sym in newStr; // ..


    То есть тут дважды используется линейный проход, а не линейный внутри линейного, а значит умножать не нужно - сложность линейная.
    Ответ написан
    Комментировать
  • Нужно ли умножать сложности?

    @deliro
    Нет. Вот если бы у тебя было два вложенных цикла по string, то да. А тут сложность "складывается", потому что сначала O(n) — реверс, потом O(n) — создание цикла, потом O(n) — join. Но т.к. константы в сложности никому не нужны — это только O(n)

    Но ты, конечно, не поверишь, поэтому вот тебе доказательство. Время линейно растёт вместе с N
    5c6f07ce35b63943246212.png
    Ответ написан
    Комментировать
  • Как происходит сортировка по ключу?

    @MAGistr_MTM
    Учусь программировать
    sorted("This is a test string from Andrew".split(), key=lamda x: x.lower())

    Вот так можно задать какую хочеш функцию
    Ответ написан
    Комментировать
  • Почему время выполнения на разных машинах отличается?

    @deliro
    Ещё раз, чёрным по белому. Сложность алгоритма НЕ ОТРАЖАЕТ реального времени выполнения. Время может различаться хоть в миллион раз. Сложность ОТРАЖАЕТ характер роста времени/памяти при росте этого твоего N.
    Ответ написан
    1 комментарий
  • Почему regEx не работает в firefox?

    @dodo512
    function transform(addr) {
        const regEx = /((д(ом)?|стр(оение)?|\/|-)\.?\s*|)\d+((,?\s*(к(ор(п(ус)?)?)?\.?)\s*\d+)|(\s*[а-я])|(\s*\/\s*\d+))?\s*$/;
        let result = addr.replace(regEx, function(m0, m1) {
            if (m1) {
                return m0;
            } else {
                return 'д. ' + m0;
            }
        });
        return result;
    }
    
    console.log(transform('Татарстан, г. Казань, ул. Баумана, 36'));
    Ответ написан
    Комментировать
  • Какой алгоритм эффективнее ищет минимум?

    Astrohas
    @Astrohas
    Python/Django Developer
    первый O(N)
    второй N*log(n) * C
    для поиска одного минимума хорош первый
    а для множественного поиска хорош второй в паре с банальным бинарным поиском
    Ответ написан
    Комментировать
  • Какой алгоритм эффективнее ищет минимум?

    GavriKos
    @GavriKos
    С первым все правильно.
    Со вторым - надо знать какую сортировку использует питон и смотреть ее сложность.
    Ответ написан
    2 комментария
  • Как выбрать номер дома с корпусом?

    /\d+[а-яА-Яa-zA-Z]?$/
    Ответ написан
    Комментировать
  • Почему regEx не работает в firefox?

    nyakove
    @nyakove
    Firefox не поддерживает "negative look-behind". https://bugzilla.mozilla.org/show_bug.cgi?id=1225665
    Ответ написан
    Комментировать
  • Почему regEx не работает в firefox?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    FireFox пока не поддерживает lookbehind: (?<= ) и (?<! ), которые введены в ECMA2018.
    Ответ написан
    Комментировать
  • Можно ли так описать хэш-таблицу?

    @deliro
    1. ХТ пуста от 2/3 своего размера до 1/3. 1/3 - это уже она вот-вот реаллоцируется.
    2. Про циклы - фигня. В питоне нет ни одного способа добавить элементы кучей так, чтобы на самом деле они добавились не в цикле на уровне Си. Даже dict comprehensions добавляют элементы последовательно.
    3. Хэш от ключа - это встроенная функция hash(). Для конкретной ХТ берется остаток от деления хэша на размер ХТ. На самом деле, берётся хэш по битовой маске (размер_ХТ - 1) [Например hash(obj) & 2**16 - 1]. Но для степеней двойки эти операции равноценны.
    4. Ты совсем забыл момент с разрешением коллизий (это когда хэши двух разных ключей совпадают). В питоновых словарях это самый интересный момент. И именно из-за него удаленные данные из словаря не удаляются физически до следующей реаллокации.
    5. "Очень быстро" - это как?

    UPD.

    На текущий момент реализация словаря в питоне поменялась. В 3.6 версии сделали все словари по умолчанию ordered и заодно уменьшили размер словаря в байтах на 20-25%. Вот реализация актуальных словарей на питоне (в оригинале, она, конечно на Си):

    Раскрыть
    import array
    import collections
    import itertools
    
    # Placeholder constants
    FREE = -1
    DUMMY = -2
    
    
    class Dict(collections.MutableMapping):
        "Space efficient dictionary with fast iteration and cheap resizes."
    
        @staticmethod
        def _gen_probes(hashvalue, mask):
            "Same sequence of probes used in the current dictionary design"
            PERTURB_SHIFT = 5
            if hashvalue < 0:
                hashvalue = -hashvalue
            i = hashvalue & mask
            yield i
            perturb = hashvalue
            while True:
                i = (5 * i + perturb + 1) & 0xFFFFFFFFFFFFFFFF
                yield i & mask
                perturb >>= PERTURB_SHIFT
    
        def _lookup(self, key, hashvalue):
            "Same lookup logic as currently used in real dicts"
            assert self.filled < len(self.indices)  # At least one open slot
            freeslot = None
            for i in self._gen_probes(hashvalue, len(self.indices) - 1):
                index = self.indices[i]
                if index == FREE:
                    return (FREE, i) if freeslot is None else (DUMMY, freeslot)
                elif index == DUMMY:
                    if freeslot is None:
                        freeslot = i
                elif (
                    self.keylist[index] is key
                    or self.hashlist[index] == hashvalue
                    and self.keylist[index] == key
                ):
                    return (index, i)
    
        @staticmethod
        def _make_index(n):
            "New sequence of indices using the smallest possible datatype"
            if n <= 2 ** 7:
                return array.array("b", [FREE]) * n  # signed char
            if n <= 2 ** 15:
                return array.array("h", [FREE]) * n  # signed short
            if n <= 2 ** 31:
                return array.array("l", [FREE]) * n  # signed long
            return [FREE] * n  # python integers
    
        def _resize(self, n):
            """Reindex the existing hash/key/value entries.
               Entries do not get moved, they only get new indices.
               No calls are made to hash() or __eq__().
    
            """
            n = 2 ** n.bit_length()  # round-up to power-of-two
            self.indices = self._make_index(n)
            for index, hashvalue in enumerate(self.hashlist):
                for i in Dict._gen_probes(hashvalue, n - 1):
                    if self.indices[i] == FREE:
                        break
                self.indices[i] = index
            self.filled = self.used
    
        def clear(self):
            self.indices = self._make_index(8)
            self.hashlist = []
            self.keylist = []
            self.valuelist = []
            self.used = 0
            self.filled = 0  # used + dummies
    
        def __getitem__(self, key):
            hashvalue = hash(key)
            index, i = self._lookup(key, hashvalue)
            if index < 0:
                raise KeyError(key)
            return self.valuelist[index]
    
        def __setitem__(self, key, value):
            hashvalue = hash(key)
            index, i = self._lookup(key, hashvalue)
            if index < 0:
                self.indices[i] = self.used
                self.hashlist.append(hashvalue)
                self.keylist.append(key)
                self.valuelist.append(value)
                self.used += 1
                if index == FREE:
                    self.filled += 1
                    if self.filled * 3 > len(self.indices) * 2:
                        self._resize(4 * len(self))
            else:
                self.valuelist[index] = value
    
        def __delitem__(self, key):
            hashvalue = hash(key)
            index, i = self._lookup(key, hashvalue)
            if index < 0:
                raise KeyError(key)
            self.indices[i] = DUMMY
            self.used -= 1
            # If needed, swap with the lastmost entry to avoid leaving a "hole"
            if index != self.used:
                lasthash = self.hashlist[-1]
                lastkey = self.keylist[-1]
                lastvalue = self.valuelist[-1]
                lastindex, j = self._lookup(lastkey, lasthash)
                assert lastindex >= 0 and i != j
                self.indices[j] = index
                self.hashlist[index] = lasthash
                self.keylist[index] = lastkey
                self.valuelist[index] = lastvalue
            # Remove the lastmost entry
            self.hashlist.pop()
            self.keylist.pop()
            self.valuelist.pop()
    
        def __init__(self, *args, **kwds):
            if not hasattr(self, "keylist"):
                self.clear()
            self.update(*args, **kwds)
    
        def __len__(self):
            return self.used
    
        def __iter__(self):
            return iter(self.keylist)
    
        def iterkeys(self):
            return iter(self.keylist)
    
        def keys(self):
            return list(self.keylist)
    
        def itervalues(self):
            return iter(self.valuelist)
    
        def values(self):
            return list(self.valuelist)
    
        def iteritems(self):
            return itertools.izip(self.keylist, self.valuelist)
    
        def items(self):
            return zip(self.keylist, self.valuelist)
    
        def __contains__(self, key):
            index, i = self._lookup(key, hash(key))
            return index >= 0
    
        def get(self, key, default=None):
            index, i = self._lookup(key, hash(key))
            return self.valuelist[index] if index >= 0 else default
    
        def popitem(self):
            if not self.keylist:
                raise KeyError("popitem(): dictionary is empty")
            key = self.keylist[-1]
            value = self.valuelist[-1]
            del self[key]
            return key, value
    
        def __repr__(self):
            return "Dict(%r)" % self.items()
    
        def show_structure(self):
            "Diagnostic method.  Not part of the API."
            print("=" * 50)
            print(self)
            print("Indices:", self.indices)
            for i, row in enumerate(zip(self.hashlist, self.keylist, self.valuelist)):
                print(i, row)
            print("-" * 50)
    
    
    if __name__ == "__main__":
        d = Dict([("timmy", "red"), ("barry", "green"), ("guido", "blue")])
        d.show_structure()

    Описание (возможно, понадобится VPN из-за выходок РКН)
    Ответ написан
    2 комментария
  • Есть ли аналог оператора вставки в начало очереди?

    longclaps
    @longclaps
    Для очереди используйте очередь или очередь.
    Ответ написан
    Комментировать