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

    fox_12
    @fox_12 Куратор тега Python
    Расставляю биты, управляю заряженными частицами
    list(map(int, filter(str.isdigit, ['4', '10', '4', 'A', 'T'])))
    > [4, 10, 4]
    Ответ написан
    Комментировать
  • Как отделить числа от букв в списке?

    lst = ['4', '10', '4', 'A', 'T']
    new_lst=[]
    
    for element in lst:
        if element.isdigit():
            new_lst.append(int(element))
        else:
            new_lst.append(element)


    С заменой в текущем списке:
    lst = ['4', '10', '4', 'A', 'T']
    
    for i in range(len(lst)):
        if lst[i].isdigit():
            lst[i] = int(lst[i])
            
    print(lst)
    Ответ написан
    4 комментария
  • Почему индекс нулей в списке равен нулю?

    Vindicar
    @Vindicar
    RTFM!
    У тебя в строках массива несколько нулей. Метод index() по умолчанию находит только первое искомое значение. Если бы ты почитал документацию, ты бы это понял, и увидел, как это обойти.

    list.index(x[, start[, end]])

    Return zero-based index in the list of the first item whose value is equal to x. Raises a ValueError if there is no such item.

    The optional arguments start and end are interpreted as in the slice notation and are used to limit the search to a particular subsequence of the list. The returned index is computed relative to the beginning of the full sequence rather than the start argument.


    Вообще, раз уж ты ручками перебираешь строки и ячейки матрицы, используй enumerate().
    for i_row, row in enumerate(grid):  # row == grid[i_row]
        for i_col, value in enumerate(row):  # value == row[i_col]
            # далее сам
    Ответ написан
    1 комментарий
  • Как думаете, есть ли подвох в пк за 10 к?

    @Komandir_Bublik
    Там один ссдшник стоит больше 10к, о чем тут говорить?
    Ответ написан
    6 комментариев
  • Курсор ввода в любом месте окна браузеров?

    rus0nix
    @rus0nix
    Admin
    Видимо вы нажали клавишу F7 в Microsoft Edge.
    5b549528da25f774201802.jpeg
    Нажмите опять эту клавишу для отключения.
    Ответ написан
    20 комментариев
  • Насколько такой метод проверки является корректным и как его можно сократить?

    Vindicar
    @Vindicar
    RTFM!
    1. Не надо проверять в рантайме type(m) == int. Достаточно указать в заголовке функции
    def add_time(self, h: int = 0, m: int = 0, d: int = 0, dw: int = 0, mh: int = 0, y: int = 0):

    Этого будет достаточно, чтобы IDE/статический анализатор сказал программисту "эй, ты фигню передаёшь в этот метод". Да, это не будет контролироваться во время выполнения, но тут уже другой вопрос: если клиент-программист сделал класс, неотличимый от int, стоит ему позволить этот класс передать вместо int. Ответственность будет на нём.

    2. Ну для конкретно твоей проверки по значению можно просто:
    if any(v < 0 for v in [h,m,d,dw,mh,y]):
        raise ValueError()

    Если хочешь красиво, можно и выпендриться:
    args = {'h':h, 'm':m, 'd':d, 'dw':dw, 'mh':mh, 'y':y}
    bad = list(filter(lambda k: args[k] < 0, args.keys()))
    if bad:
        raise ValueError('Invalid values for: ' + ','.join(bad))


    Ну а при большом желании можно и целый велосипед для декларативной проверки параметров замутить.
    Но смысл?
    import functools
    import inspect
    
    # пусть чек-функция имеет вид (value) -> bool, и возвращает True для "хороших" значений. Пример:
    def not_whitespace(s: str) -> bool:
        'String must not contain only whitespace'  # док строка будет использоваться в сообщении об ошибке
        return bool(s.strip())  # проверяем что строка не состоит из одних пробелов.
    # чек-функции можно генерировать и на ходу:
    def in_range(low, high):
        def check(value):
            return (low is None or low <= value) and (high is None or value <= high)
        check.__doc__ = f'Value must be between {low} and {high}.'
        return check
    # теперь сделаем декоратор, который умеет принимать чек-функции и применять их перед вызовом цели
    def check(**checks):
        def wrapper(func):
            sign = inspect.signature(func)
            names = list(sign.parameters.keys())  # имена параметров по порядку
            not_found = set(checks.keys()) - set(names)  # все ли чеки ссылаются на известные параметры?
            if not_found:
                # у нас есть чек на неизвестный параметр!
                raise NameError(', '.join(not_found))
            # всё ок, делаем обёртку над функцией
            
            @functools.wraps(func)
            def wrapped(*args, **kwargs):
                bad = []
                for param_name, check_func in checks.items():
                    idx = names.index(param_name)
                    if idx < len(args):
                        # параметр был передан через args
                        value = args[idx]
                        if not check_func(value):  # вызываем чек-функцию
                            err = getattr(check_func, '__doc__', '')
                            if err:
                                bad.append(f'{param_name} ({err})')
                            else:
                                bad.append(param_name)
                    else:
                        pass  # могут быть хитрости с kwargs-only параметрами. Тут уж извини, мне влом писать.
                if bad:  # нашли ошибки?
                    raise ValueError('Bad value for parameters: '+', '.join(bad))
                    # тут ещё можно помудрить над скрытием последнего фрейма в traceback, но мне опять влом
                else:  # не нашли, вызываем функцию
                    return func(*args, **kwargs)
            
            return wrapped
        return wrapper
    
    # пример использования
    # строка должна быть не из одних пробелов
    # число должно быть в пределах от 1 до 10 включительно
    @check(s=not_whitespace, n=in_range(1, 10))
    def repeat(s: str, n: int) -> str:
        return s * n
    
    print(repeat('test ', 3))
    
    try:
        print(repeat('test ', 20))
    except ValueError as err:
        print('yep! it failed!', err)
    
    try:
        print(repeat('test ', -1))
    except ValueError as err:
        print('yep! it failed!', err)
    
    try:
        print(repeat('    ', 5))
    except ValueError as err:
        print('yep! it failed!', err)
    
    try:
        print(repeat('    ', 15))
    except ValueError as err:
        print('yep! it failed!', err)
    Ответ написан
    3 комментария
  • Как мне сделать размещение чисел в определённом порядке?

    Mi11er
    @Mi11er
    A human...
    a = [1,2,3,4,5,6,7]
    
    x = 0
    while x < len(a)-1:
        print(f"{a[x]}-{a[x+1]}")
        x+=2
    
    if len(a) % 2 != 0:
        print(f"-{a[-1]}-")
    Ответ написан
    2 комментария
  • Как получить ссылку на объект по его атрибуту?

    Нужно в sorted задавать параметр key, а в нем указывать атрибут.
    from operator import attrgetter
    
    sorted(items, key=attrgetter('name'))

    https://pythonru.com/osnovy/vozmozhnosti-i-primery...
    https://docs.python.org/3/library/operator.html#op...
    Ответ написан
    3 комментария
  • Почему не копируется список внутри класса?

    Vindicar
    @Vindicar
    RTFM!
    Запомни одну простую вещь: переменная в питоне - это просто ссылка, ярлык!
    Покажу на примере:
    a = [1, 2, 3]  # а содержит ссылку на некий список
    b = a  # b содержит ссылку на тот же список!
    print(b is a)  # True. b - это тот же объект, что и a
    a.append(4)  # Ссылка а не меняется, меняется объект по этой ссылке!
    print(a)  # [1, 2, 3, 4]
    print(b)  # [1, 2, 3, 4] так как b ссылается на то же, что и a
    a = [1, 2]  # теперь a хранит ссылку на другой объект-список!
    print(b is a)  # False. Даже если бы содержимое списков совпало, это два разных объекта.
    print(a)  # [1, 2]
    print(b)  # [1, 2, 3, 4] так как b хранит ссылку на старый список
    a.append(5)
    print(a)  # [1, 2, 5] изменили объект, на который ссылается a
    print(b)  # [1, 2, 3, 4] b ссылается на другой объект, он остался не изменён.


    Соответственно, у твоей проблемы есть четыре разных решения.
    1. Делай копию тогда, когда она тебе понадобится (т.е. тогда, когда в исходном списке уже лежат нужные значения). Не полагайся на то, что две доступные извне переменные всегда будут указывать на один и тот же список.
    2а. Не заменяй список на другой. Если ты хочешь заменить именно содержимое списка, а не заменять один объект-список на другой, можно написать так: a[:] = [1, 2, 3, 4] Для надёжности можешь этот список показать как read-only property вместо обычного поля класса - тогда можно будет модифицировать объект списка (добавлять/удалять элементы), но нельзя будет заменить список на другой.
    2б. Покажи наружу список как read-write property, при записи в property записывай список в обе переменные.
    3. Добавь в класс методы для управления элементами списка, сам список наружу не показывай.
    Ответ написан
    3 комментария
  • Почему не копируется список внутри класса?

    @o5a
    Этим действием
    item.open_items = ['item 1', 'item 2']
    Вы не добавляете элементы к изначальному списку open_items, а перезаписываете его другим списком (объектом), поэтому ссылающиеся на изначальный список self.sorted_items_2 и т.п. так и остаются ссылаться на изначальный пустой список.
    Если бы делали так например
    item.open_items.append('item 1')
    То и ссылки бы сохранялись.
    Ответ написан
    4 комментария
  • Как вывести первый ключ из словаря?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Как вывести первый ключ из словаря?

    Как вывести только 'Pomidorka' из словаря?

    Вы спрашиваете как вывести первый ключ, а потом говорите про помидорку, а это третий ключ. Так чего именно вы хотите?

    Если речь о том, чтобы вообще получить все ключи из словаря, то воспользуйтесь учебником, по питону и там вы увидите:
    list(users.keys())  # ['Ivan', 'Anton', 'Pomidorka', 'Ananas']

    Такой порядок для вашего кода будет в питоне начиная с 3.6.

    Если нужно взять именно первый ключ, то так:
    list(users.keys())[0]

    Если речь о современном питоне (начиная с 3.6), то порядок ключей в словаре сохраняется при добавлении элементов, поэтому помидорку получать придётся запрашивая 2 (третий по счету) элемент списка ключей:
    list(users.keys())[2]

    Если питон у вас более старенький, то порядок следования ключей не гарантируется и вам придётся объяснить, всё же, помидорку вам или просто первый попавшийся ключ.

    Короче. Бесят эти лентяи, которые вместо чтения крошечной книжки для чайников задают тут тупые бестолковые и неконкретные вопросы, на которые, чтобы нормально ответить, нужно тратить уйму времени. ХВАТИТ ЭТО ТЕРПЕТЬ!
    Даёшь дизлайки за вопросы и за ответы!
    Ответ написан
    Комментировать
  • Как получить кол-во атрибутов класса и передать атрибуты в словарь?

    @serhiops
    Python/JavaScript/C++
    Судя по вопросу, ты вообще не понимаешь как работать с ООП в питоне. Атрибуты класса ты можeшь получить так:
    Person.__dict__
    Добавить:
    setattr(Person, 'name', 'value')
    Удалить:
    delattr(Person, 'name',)
    Чтобы можно было делать так:
    p = Person(*attr)
    len(p)

    Нужно определить метод __len__ в этом классе:
    class Person:
        .......
        def __len__(self):
            return x

    Этот метод будет срабатывать когда ты будешь указывать обьект класса как атрибут функции len
    Ответ написан
    3 комментария
  • Противоположность not?

    Vindicar
    @Vindicar
    RTFM!
    if bbb:
    Сработает, но не всегда.
    Нужно иметь ввиду, что истинность в питоне - штука расплывчатая. Например:
    0, 0.0 - ложны, ненулевые числа - истинны.
    пустая строка - ложна, непустая строка - истинна
    пустой список / словарь / множество - ложны, непустые - истинны
    None ложно всегда.

    А вот для других классов результат не всегда однозначен.
    Если класс описывает для себя понятие ложности и истинности (определяет метод __bool__()), то он может сам решать, когда его экземпляр будет ложным, а когда истинным (так же как это делает список).
    Если же класс это не описывает, его экземпляры всегда истинны.
    Ответ написан
    1 комментарий
  • Можно ли использовать имя переменной, совпадающей с ключом в словаре?

    iggor-markin
    @iggor-markin
    Python Developer
    В твоём случае — да, можно. Проблем не будет. Хотя переменные и похожи внешне на ключи словаря, но это совершенно разные объекты, не имеющие ничего общего.
    Ответ написан
    1 комментарий
  • Как вывести вместо булевого значение другое?

    @kamenyuga
    Выглядит как стандартная проблема данных и их представления.

    Можно все запихнуть в класс, используя, например, property - как раз для этого случая они подходят на 100%. Но придется написать много кода.

    Альтернатива - разделить данные и представление. В простом случае - за пределами класса нужно будет создать словарь (набор словарей) для выбора текста в зависимости от данных. Именно так зачастую работают всякие системы локализации, переводов, кастомизации внешнего вида и т.д.

    class Person:
    
        has_map = {True: 'Есть', False: 'Нет'}
    
        def __init__(self, name):
            self.name = name
            self._something_1 = False
            self._something_2 = True
    
        @property
        def something_1(self):
            return self.has_map[self._something_1]
    
        @something_1.setter
        def something_1(self, value):
            self._something_1 = value
    
        @property
        def something_2(self):
            return self.has_map[self._something_2]
    
        @something_2.setter
        def something_2(self, value):
            self._something_2 = value
    
    def attr_mapping(value):
        has_map = {True: 'Есть', False: 'Нет'}
        if isinstance(value, bool):
            return has_map[value]
    
    if __name__ == '__main__':
    
        Anna = Person('Anna')
        print(Anna.something_2)
        Anna.something_2 = False
        print(Anna.something_2)
    
        Anna = Person('Anna')
        print(attr_mapping(Anna._something_2))
        Anna._something_2 = False
        print(attr_mapping(Anna._something_2))
    Ответ написан
    Комментировать
  • Как вывести вместо булевого значение другое?

    shabelski89
    @shabelski89
    engineer
    class Person:
        def __init__(self, name):
            self.name = name
            self.something_1 = 'abc'
            self.something_2 = 123
    
    
    def check_attr(obj, attr_name):
        try:
            value = obj.__getattribute__(attr_name)
            return f'{obj} имеет аттрибут - {attr_name} со значением - {value}'
        except AttributeError:
            return f'{obj} не имеет аттрибута - {attr_name}'
    
    
    if __name__ == "__main__":
        p = Person(name='Alex')
    
        print(check_attr(p, 'something_1'))
        print(check_attr(p, 'something_2'))
        print(check_attr(p, 'something_33333'))
    Ответ написан
    Комментировать
  • Как вывести вместо булевого значение другое?

    lxstvayne
    @lxstvayne
    Люблю Python
    Можно адаптировать как вам угодно
    class BaseField:
        def __init__(self, value):
            self.value = value
    
        def __eq__(self, other):
            if isinstance(other, BaseField):
                return self.value == other.value
    
            return self.value == other
    
        def __repr__(self):
            return str(self.value)
    
    
    class BoolField(BaseField):
        def __str__(self):
            return {
                True: 'Есть',
                False: 'Нет'
            }.get(self.value)
    
    
    class MoneyField(BaseField):
        def __str__(self):
            return f'{self.value}$'
    
    
    class Person:
        def __init__(self, name):
            self.name = name
            self.something_1 = BoolField(False)
            self.something_2 = BoolField(True)
            self.money = MoneyField(1500)
    
    
    p = Person('Vladimir')
    
    print(p.something_1)
    print(p.money)
    Ответ написан
    2 комментария
  • Можно ли спрятать абзацы (пример со скринами) в Sublime text по умолчанию?

    idShura
    @idShura
    Пакет Sublime Text, который автоматически сохраняет/восстанавливает свернутые области кода в файлах.
    Auto​Fold​Code
    Ответ написан
    1 комментарий
  • Как сохранить прозрачное изображение в pygame?

    iggor-markin
    @iggor-markin
    Python Developer
    Глубина цвета должна быть 32

    image = pygame.Surface([640,480], pygame.SRCALPHA, 32)
    image = image.convert_alpha()
    Ответ написан
    1 комментарий