Ответы пользователя по тегу Python
  • Зачем в Python есть два способа создания копии списка?

    aRegius
    @aRegius
    Python Enthusiast
    Приветствую, weranda.

    ...Почему так происходит – при изменении во вложенном списке с которого снята копия элементы меняются и в других списках, а отдельные элементы в скопированных списках не меняются?...

    Потому что [:], copy(), list() создают т.н. "поверхностные" копии. Используйте copy.deepcopy() для решения подобной проблемы:
    >>> a = [1 , 2, [3, 4]]
    >>> import copy
    >>> b = copy.deepcopy(a)
    >>> a[2][1] = 156
    >>> a
    [1, 2, [3, 156]]
    >>> b
    [1, 2, [3, 4]]
    Ответ написан
    Комментировать
  • Что я сделал не правильно или что я не продумал?

    aRegius
    @aRegius
    Python Enthusiast
    Привет, Вадим.

    while health_hero > 0 and health_troll > 0:
        damage_hero = random.randint(1, 5)
        damage_troll = random.randint(1, 5)
        health_hero -= damage_troll
        health_troll -= damage_hero
        print(health_hero, health_troll)
    
    if health_hero > health_troll:
        print("Победил герой!")
    else:
        print("Победил тролль!")
    Ответ написан
    4 комментария
  • Какое из двух простых условий использовать?

    aRegius
    @aRegius
    Python Enthusiast
    Приветствую, weranda.

    Python, каким я его для себя принимаю, и каким его видят разработчики, к мнению которых я прислушиваюсь - это в первую очередь выразительность/читабельность/удобство восприятия кода. Оптимизация после. А маниакальное стремление впихнуть все в одну строчку (а-ля "А вот я могу и так") - это еще после того, как после.

    Поэтому вариант 1.

    Дополнительный, более наглядный, пример навскидку к сказанному:

    хуже:
    >>> my_lists = [[[1, 2, 3], [4, 5, 6]]]
    >>> flat = [x for sub1 in my_lists for sub2 in sub1 for x in sub2]
    >>> flat
    [1, 2, 3, 4, 5, 6]


    лучше:
    >>> my_lists = [[[1, 2, 3], [4, 5, 6]]]
    >>> flat = []
    >>> for sub1 in my_lists:
             for sub2 in sub1:
    	             flat.extend(sub2)
    >>> flat
    [1, 2, 3, 4, 5, 6]


    Такова моя точка зрения.
    Ответ написан
    Комментировать
  • Как научиться правильно писать код по паттерну MVC в pyhon?

    aRegius
    @aRegius
    Python Enthusiast
    Добрый день, Дмитрий.

    Паттерн MVC это не столько к Python, сколько, скажем, к Django (или, другими словами, не столько к языку, сколько к фреймворку). Хотя, справедливости ради, Django, наряду с MVC, позиционируют и как MTV (Model-Template-View)... Но это частности, не имеющие отношения к Вашему текущему вопросу.

    Меня, в свое время, абсолютно удовлетворило описание MVC, предложенное создателями Django - Адрианом Головатым и Джейкобом Капланом-Моссом. А ввиду того, что я обычный человек - не уникум, не победитель олимпиад и не мастер спорта по шахматам, полагаю, что Вам также может оказаться полезным.

    Издание на русском: Django.Подробное руководство (Второе издание)
    Главы 1 ("Введение в Django") и 5 ("Модели", подраздел "Шаблон проектирования MTV (или MVC)")

    Или то же издание на английском: The Definitive Guide to Django. Web Development Done Right, Second Edition

    Обе были в открытом доступе.
    Ответ написан
    3 комментария
  • Как из двух списков сделать один?

    aRegius
    @aRegius
    Python Enthusiast
    Добрый вечер, pypyshka.

    Воспользуйтесь функцией map().

    >>> a = [('1', 'a', 'b', 'c'), ('2', 'x', 'y', 'z'), ('3', 'x', 'y', 'z')]
    >>> b = [('a', 'b', 'c', 'd'), ('x', 'y', 'z', 'w'), ('x', 'y', 'z', 'w'), ('u', 'o', 'n', 'm')]
    >>> new_list = lambda x, y: [i for i in x] + [i for i in y if i not in x]
    >>> new_result = list(map(new_list, a, b))
    >>> new_result
    [['1', 'a', 'b', 'c', 'd'], ['2', 'x', 'y', 'z', 'w'], ['3', 'x', 'y', 'z', 'w']]
    Ответ написан
    1 комментарий
  • Как вывести строку, содержащую максимально большое число, из списка?

    aRegius
    @aRegius
    Python Enthusiast
    >>> a = ['maz/2/arini', 'ya/16/streb', 'lovel/5/as']
    >>> b = [i.split('/') for i in a]
    >>> b_sort = sorted(b, key=lambda x: int(x[1]))
    >>> b_sort_max = b_sort[-1]
    >>> text_max = '/'.join(b_sort_max)
    >>> text_max
    'ya/16/streb'
    Ответ написан
    1 комментарий
  • Как заставить функцию zip добавлять пустые элементы?

    aRegius
    @aRegius
    Python Enthusiast
    Добрый день.

    Вам нужна функция zip_longest из модуля itertools.

    >>> from itertools import zip_longest
    >>> a = ['1', '2']
    >>> b = []
    >>> list(zip_longest(a, b, fillvalue=''))
    [('1', ''), ('2', '')]
    >>>


    Ну, тут все понятно по коду вроде...
    Ответ написан
    2 комментария
  • Какую версию Python и литературу посоветуете?

    aRegius
    @aRegius
    Python Enthusiast
    Что могу порекомендовать из литературы (коль скоро вопрос именно о ней) чем пользовался лично:

    1. Во-первых, однозначно Доусон. Интересно, быстро, практично.

    2. После - на выбор: если очень сжато - то ЭТО, если основательно - ЭТО.

    Для начала все.

    С версиями сейчас не заморачивайся, отдавая приоритет 3-ке. По поводу ближайшего будущего Python, связанного с его версиями, если интересно, почитай небольшое интервью с Андреем Светловым ТУТ.
    Ответ написан
    2 комментария
  • Как проверить есть в строке кириллица?

    aRegius
    @aRegius
    Python Enthusiast
    >>> kirill = ('абвгдеёжзийклмнопрстуфхцчшщъыьэюя')
    >>> text = 'Юvrsfы'
    >>> find_kirill = [x for x in kirill if x in text.lower()]
    >>> find_kirill
    ['ы', 'ю']
    >>>
    Ответ написан
    2 комментария
  • Как в python извлечь корень?

    aRegius
    @aRegius
    Python Enthusiast
    Существует три способа вычисления квадратных корней: с помощью функции sqrt() модуля math, с помощью выражения ** и с помощью встроенной функции pow(). В данном случае я указал их в порядке снижения скорости вычисления. Т.е. быстрее других считает sqrt(), потом **, потом pow(). С другой стороны, отмечу, что для работы с sqrt() необходимо импортировать модуль math, а ** и pow() доступны сразу:

    >>> import math
    >>> math.sqrt(9)
    3.0
    >>> 9 ** .5
    3.0
    >>> pow(9, .5)
    3.0
    Ответ написан
    8 комментариев
  • Как решить задачу по замене слов, содержащих ошибки на корректные слова?

    aRegius
    @aRegius
    Python Enthusiast
    Привет.

    Пробуйте библиотеку difflib:

    >>> text = 'я пешу биз ашибок'
    >>> b = ['пишу', 'без', 'ошибок']
    >>> text_new = text.split() # т.к. вторым аргументом в difflib.get_close_matches должен быть list
    >>> import difflib
    >>> for ok_word in b:
    	        wrong_word = difflib.get_close_matches(ok_word, text_new) # ищем "плохое" слово
    	        wrong_word = ''.join(wrong_word) # преобразуем в строку из списка для корректной работы replace
    	        text = text.replace(wrong_word, ok_word)
    
    	
    >>> text
    'я пишу без ошибок'
    Ответ написан
    2 комментария
  • Как вывести элементы в список на питоне?

    aRegius
    @aRegius
    Python Enthusiast
    P.S. Дополню ответ Алексея

    ... и если действительно нужно получить список с элементами списков, а не кортежей, дополнительно прогоните генератором списков:
    >>> result = [list(item) for item in result]
    >>> result
    [['1', 'a', 'x'], ['2', 'b', 'y'], ['3', 'c', 'z']]
    Ответ написан
    2 комментария
  • Почему в Python при целочисленном делении (-1 // 2) получается ответ (-1)?

    aRegius
    @aRegius
    Python Enthusiast
    Добрый вечер.

    Просто запомните, что оператор // производит деление, округляя результат до ближайшего меньшего целого значения. Вот и все.

    -1 / 2 = - 0.5. Ближайшее меньшее целое значение: -1.
    Ответ написан
    Комментировать
  • Как найти соседние элементы массива, сумма которых максимальна (минимальна)?

    aRegius
    @aRegius
    Python Enthusiast
    Привет.

    num = [.........]
    opt = list(map(lambda x, y: (x + y, (x, y)), num, num[1:]))
    max_sum_pair = max(opt)    # итоговый кортеж МАКСИМУМ (сумма, (число 1, число 2))
    min_sum_pair = min(opt)     # МИНИМУМ
    Ответ написан
    Комментировать
  • Почему ключи словаря меняют свой порядок, каков алгоритм?

    aRegius
    @aRegius
    Python Enthusiast
    Привет.

    Если с английским на уровне чтения литературы - обратите внимание на эту книгу. В контексте вашего вопроса - страница 85, подраздел dict and set Under the Hood. Да и просто отличная книга (издание на русском не рекомендую по причине плохого перевода).

    На русском языке по данной тематике можно посмотреть этот топик.
    Ответ написан
    Комментировать
  • 'str'.startwith() - AttributeError: 'str' object has no attribute 'startwith' - why?

    aRegius
    @aRegius
    Python Enthusiast
    puker-ti, startswith...
    Ответ написан
    Комментировать
  • Как решить, казалось бы, простую задачу на python3?

    aRegius
    @aRegius
    Python Enthusiast
    Привет.

    1. Есть два числа, x и y (целые положительные).
    2. Есть их разность, z (z = x - y)
    3. Чтобы найти большее из них, всего-то нужно сумму этих двух чисел и их разности разделить на 2:
    max_num = (x + y + z)/2
    4. Единственная "засада" в том, что, ввиду неопределенности чисел, их разность может быть отрицательным числом (например, x = 5, y = 853, x - y = - 848).
    5. Поэтому нам надо обеспечить, чтобы разность, при любом раскладе, была положительная.
    6. Для этого мы эту самую разность возводим во вторую степень и извлекаем из результата квадратный корень - для того, чтобы код был менее шумный, разделим эту процедуру на два этапа: a) z = (x - y) ** 2; б) z = z ** .5

    7. Итоговый код:
    z = (x - y) ** 2
    z = z ** .5
    max_num = (x + y + z) / 2
    Ответ написан
    2 комментария
  • Как изучить Python после C++?

    aRegius
    @aRegius
    Python Enthusiast
    Nexeon, я тоже хотел бы помочь вам с рекомендацией. Одно но... Я, в силу своей природы, лучше всего воспринимаю материал в виде книг (печать либо pdf). Ни видеокурсы, ни онлайн tutorial (скомпанованные в виде справочной информации, в коем ключе я их и использую) мне не "идут". Поэтому, ни первого, ни второго я посоветовать не могу, ибо не знаю/не пользовался (справочный характер использования официального Python-tutorial не в счет).

    Но по книгам подскажу:

    1. Для быстрого "погружения" - Think Python (2-издание 2016 год)
    2. Для основательного - Learning Python (5-издание 2013 год)

    P.S. В скобках я специально пометил издание/год. На это нужно всегда обращать внимание, поскольку книга может переиздаваться и, логично, выбирать стоит более свежую версию. Первая книга на русский не переведена, вторая - переведено издание 2009 года.
    Конечно, лучше читайте в оригинале. Обе, погуглите, были в открытом доступе.

    P.S. Информация для всех: недавно вышла отличная книга Fluent Python (2015 год). (Nexeon, с нее, думаю, начинать не стоит). Так вот, я-то начал ее читать сразу в оригинале, потом, узнав, что вышел русскоязычный перевод (что большая редкость для такой оперативности), я, любопытства ради, пролистал... Мне настолько нечего сказать по этому поводу, что просто в тысячный раз отмечу уже избитую истину - английский, это наше всё. Кстати, для сравнения, и справедливости ради, Learning Python ("Изучаем Python") 2009 года переведен отлично.
    Ответ написан
    2 комментария
  • Как улучшить теоретическую базу в программировании?

    aRegius
    @aRegius
    Python Enthusiast
    Артем, приветствую!
    Я далеко не гуру программирования, и тоже, кстати, программист-самоучка, однако мой жизненный опыт и здравый смысл в подобной ситуации продиктовал бы мне несколько иной подход к решению вопроса.

    1. Самое очевидное, простое и правильное (при условии, что для вас этот вопрос все еще актуален и насущен) - связаться с этими людьми повторно и уточнить лично у них, о каких именно знаниях идет речь. Как калька: "Добрый день! Меня зовут Артем, тогда-то я был у вас на собеседовании, мне отказали, сославшись на нехватку теоретических знаний. Вы не могли бы мне помочь советом, каких именно знаний мне не хватает? Эта информация помогла бы мне их приобрести...." Ну как-то так...

    2. На будущее, при возникновении подобных ситуаций, задавайте такие вопросы прямо на собеседовании. Иначе потом снова будут эти "гадания на кофейной гуще".

    3. По каким критериям вы собираетесь выбирать источник знаний, предложенный вам мнением людей, каждый из которых представляет собой уникальную смесь возраста, знаний и опыта, а, соответственно, свое видение ситуации?

    4. Обучения для себя, обучение в ВУЗе, и обучение для конкретной работы - суть разные вещи. Вам нужно третье, насколько я понял. Для этого нужно четко понимать, что нужно работодателю. И вариантов хорошего результата собеседования есть два - вас взяли на работу; вас не взяли на работу, но вы знаете, что конкретно вам еще нужно сделать (чего вам не хватило), чтобы вас взяли.

    Смоделируем ситуацию:
    Вы пришли на собеседование. Вам отказали: "У вас недостаточно теоретических знаний". Вы сказали "Ок" и ушли. Задали вопрос на Тостере, вам предложили 15 вариантов ответа - надо учить такие-то алгоритмы, такие-то паттерны и прочее... Вы перезваниваете рекрутеру, задаете вопрос, а вам отвечают, что вам не хватает теоретических знаний о протоколах передачи данных... Ну к примеру...

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

    Такова моя точка зрения. Удачи!

    P. S. Немножко юмора, касательно знаний, заказчиков и инструментария для решения конкретной задачи.
    Ответ написан
    1 комментарий
  • Как удалить все нулевые элементы из словаря?

    aRegius
    @aRegius
    Python Enthusiast
    Это можно сделать, используя самые базовые инструменты Python (по умолчанию,
    присвоим словарь переменной d):

    d1 = {}
    
    for value in d.values():
        d1.update(value)
    
    for key in d:
        for key1 in d1:
            if d[key][key1] == 0:
                del d[key][key1]


    Пользуйтесь на здоровье.
    Ответ написан
    Комментировать