Don Python
74 subscribers
6 photos
1 file
19 links
Путь python разработчика после 30. Знания, обсуждения, книги, rock & roll
Download Telegram
[PROBLEM] Tides

Представьте что вы попали на необитаемый остров. Чем бы занялись? Можно добыть еды или обустроить жилище, а можно как наш герой наблюдать за приливами и отливами 🐳

Сложность для junior: 5 / 10

Задача с решением на русском здесь

* Прежде чем смотреть готовое решение,желательно потратить 2-3 часа на самостоятельные попытки. И если не получится, то переходить к анализу ответа.

———

Good coding 🧑‍💻

#python #problem #list
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
🤕 [SHORT] Циклический сдвиг списка

Циклический сдвиг — это когда каждая итерация цикла перемещает первый элемент списка в конец, а все остальные элементы сдвигает на минус один индекс. Есть два способа сделать это.

С созданием копии списка:

my_list = [1, 5, 2, 4, 3]
new_list = my_list[:]

for i in range(len(my_list)):
my_list = new_list[i:] + new_list[:i]


Без копии:

my_list = [1, 5, 2, 4, 3]

for _ in range(len(my_list)):
my_list.append(my_list[0])
my_list.pop(0)


Выбор способа зависит от задачи.

———

Good coding 🧑‍💻

#python #short #list
Please open Telegram to view this post
VIEW IN TELEGRAM
3
⬆️ [INFO] Поиск пересечений

Помните такие конструкции в детских играх или в каких-то туториалах, когда нужно соединить линией элементы, которые подходят друг другу по каким-либо свойствам? Например в левом столбике названия цветов, а в правом их обозначения. Скорее всего, некоторые линии объединенных элементов будут пересекаться. На основании этого описания, представим два списка:

a = [5, 4, 1, 3, 2]
b = [1, 3, 2, 5, 4]


Соедините мысленно все одинаковые числа линиями. Как с помощью python посчитать количество пересечений?

Рассмотрим функцию find_intersections

def find_intersections(left_side, right_side):
num_fields = len(left_side)
intersections = 0

right_indices = {right_side[i]: i for i in range(num_fields)}

for i in range(num_fields):
for j in range(i + 1, num_fields):
left_cow_a = left_side[i]
left_cow_b = left_side[j]

right_cow_a = right_indices[left_cow_a]
right_cow_b = right_indices[left_cow_b]

if right_cow_a > right_cow_b:
intersections += 1

return intersections


Функция find_intersections подсчитывает количество "пересечений" между элементами двух списков — left_side и right_side.

Пересечение — это такая ситуация, когда два элемента в одном списке расположены в одном порядке, а в другом — в обратном.


1. Инициализация переменных:

num_fields — количество элементов в списках (они одинаковой длины).

intersections — счетчик пересечений, инициализируется нулем.

2. Создание словаря индексов:

right_indices — это словарь, где каждому элементу из списка right_side сопоставляется его индекс. Это нужно, чтобы быстро находить позиции элементов из right_side.

3. Два вложенных цикла для перебора пар элементов:


• Внешний цикл (for i in range(num_fields)) перебирает каждый элемент списка left_side как первый элемент пары.

• Внутренний цикл (for j in range(i + 1, num_fields)) перебирает каждый следующий элемент списка как второй элемент пары.

4. Сравнение порядков элементов в списках:

• Для текущей пары элементов left_cow_a (из left_side[i]) и left_cow_b (из left_side[j]), находятся их индексы в right_side с помощью словаря right_indices: это right_cow_a и right_cow_b.

• Если в right_side первый элемент пары (right_cow_a) находится позже второго (right_cow_b), то это пересечение, и счетчик intersections увеличивается на 1.

5. Результат:

• Функция возвращает общее количество пересечений.

Пример: Если:

left_side = [1, 2, 3]

right_side = [2, 1, 3]

• То пересечение будет между 1 и 2, так как их порядок в right_side обратен порядку в left_side.

———

Good coding 🧑‍💻

#python #info #list #matrix #algorithm
Please open Telegram to view this post
VIEW IN TELEGRAM
👍211
🤕 [SHORT] Поиск в множествах

Если для хранения данных не требуется сохранения порядка и дубликатов элементов, можно использовать множества вместо списков. Чем длиннее список элементов и чем дальше элемент поиска, тем больше преимуществ у множества.

Давайте убедимся на деле:

import time, random

# Генерируем список с дубликатами и преобразуем в множество
numbers_list = [random.randint(0, 10**6) for _ in range(10**6)]
numbers_set = set(numbers_list)

# Список случайных элементов для поиска
search_items = random.sample(range(10**6), 1000)

# Функция для замера времени поиска
def measure_search(container):
start = time.time()
for item in search_items:
item in container
return time.time() - start

# Замеры времени поиска
list_time = measure_search(numbers_list)
set_time = measure_search(numbers_set)

# Результаты
print(f"Поиск в списке: {list_time:.6f} сек") # Примерно 4.3 сек
print(f"Поиск в множестве: {set_time:.6f} сек") # Примерно 0.0009 сек


———

Good coding 🧑‍💻

#python #short #list #set
Please open Telegram to view this post
VIEW IN TELEGRAM
21
🤕 [SHORT] Инвертирование словаря

Предположим, что наше приложение — это что-то там связанное с английским. У нас есть некоторый словарь в котором ключ — это английское слово, а значение — перевод этого слова:

animals = {
'cat': 'кот',
'dog': 'собака',
'mouse': 'мышь',
'elephant': 'слон',
}


Нам нужно чтобы было наоборот: ключи на русском, а значения на английском. Пишем простое выражение:

print({value: key for key, value in animals.items()})

# >>> {'кот': 'cat', 'собака': 'dog', 'мышь': 'mouse', 'слон': 'elephant'}


———

Good coding 🧑‍💻

#python #short #dict
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
🤕 [SHORT] Генерация алфавита. Функция chr()

Допустим вам для проекта нужно сгенерировать английский алфавит.

alphabet = {chr(i): i - 64 for i in range(65, 91)}


Эта строчка генерирует словарь с прописными буквами английского алфавита.

Функция chr() конвертирует целое число в Unicode-символ и возвращает его.


Юникод и кодировки в Python

———

Good coding 🧑‍💻

#python #short #dict #unicode
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍11
🤕 [SHORT] Разворот списка, 3 способа

С помощью метода reverse()

my_position = ['first', 'second', 'third']
my_position.reverse()

print(my_position)
# >>> ['third', 'second', 'first']


С помощью функции reversed()

sequence = [1, 2, 3, 4, 5, 6]
reverse_sequence = list(reversed(sequence))

print(reverse_sequence)
# >>> [6, 5, 4, 3, 2, 1]


С помощью среза

split_name = ['r', 'd', 'n', 'a', 's', 'k', 'e', 'l', 'a']
reverse_split_name = split_name[::-1]

print(reverse_split_name)
# >>> ['a', 'l', 'e', 'k', 's', 'a', 'n', 'd', 'r']


———

Good coding 🧑‍💻

#python #short #list
Please open Telegram to view this post
VIEW IN TELEGRAM
21
🤕 [SHORT] Двусторонняя очередь в Python

Класс deque (от "double-ended queue" - двухсторонняя очередь) в Python удобен для работы с коллекцией элементов, где важны операции добавления и удаления элементов в начале и в конце списка. Обычные списки делают это медленно, так как элементы приходится смещать, а deque оптимизирован под такие операции, выполняя их за O(1).

from collections import deque  

# Создаем deque и добавляем элементы
queue = deque([1, 2, 3])
queue.append(4) # добавляет 4 в конец
queue.appendleft(0) # добавляет 0 в начало

print(queue) # deque([0, 1, 2, 3, 4])

# Удаляем элементы
queue.pop() # удаляет последний элемент
queue.popleft() # удаляет первый элемент

print(queue) # deque([1, 2, 3])


———

Good coding 🧑‍💻

#python #short #list #libraries #deque #collections
Please open Telegram to view this post
VIEW IN TELEGRAM
3
⬆️ [ARTICLE] Поиск кратчайшего пути

Я славно поработал и написал 2 статьи посвященные алгоритму BFS (поиск в ширину) и алгоритму Дейкстры (поиск во взвешенных графах). Для меня лучший способ в чем то разобраться - это объяснить другим как это работает. Эти работы не исключение.

Краткая статистика

- 25 000 символов
- 3 600 слов
- 23 часа работы

———

Первая часть - Алгоритмы поиска путей на пальцах. Часть 1: Поиск в ширину

Первая часть - Алгоритмы поиска путей на пальцах. Часть 2: Алгоритм Дейкстры

———

📦 Ресурсы

Это всё что я использовал для написания материала и создания анимаций:

1. Алгоритмика — много материала об алгоритмах
2. Clippa — здесь можно доработать гифки
3. ChatGPT — все знают
4. Program4you — здесь можно создавать и анимировать графы
5. Теория графов — хороший материал для прочной базы
6. Двусторонняя очередь — статья о классе deque
7. Кучи и приоритетные очереди — статья о модуле heapq

———

Good coding 🧑‍💻

#python #info #algorithms #dijkstra #bfs #graphs #habr #articles
Please open Telegram to view this post
VIEW IN TELEGRAM
3
📦 [BOOK] «Python без проблем: решаем реальные задачи и пишем полезный код». Зингаро Д

Когда самостоятельно изучаешь программирование, в какой-то момент сталкиваешься с кризисом, когда нужно двигаться дальше, а что конкретно делать не понятно.

Эта книга будет хорошим продолжением, если вы только закончили изучение базового синтаксиса и хотели бы повторить и закрепить материал.

Автор книги изложил материал следующим образом:

1. Каждая глава начинается с урока. Не расстраивайтесь если вы уже знакомы с материалом. Каждый учитель объясняет по своему и всегда есть возможность узнать что то новое.

2. После каждого урока автор подробно разбирает несколько задач (2 - 3). Советую сначала пробовать решать их самостоятельно, а потом сверяться с решением автора.

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

———

Книга на Яндекс Книгах — здесь

Купить бумажную версию — здесь

Английская версия бесплатно — здесь

Русская версия бесплатно — здесь

———

Также оставлю свой репазиторий с решенными задачами. Их около 100 там. Сверяйтесь и изучайте, но не списывайте.

Репозиторий

———

🧑‍💻 Good coding

#python #book #problems
Please open Telegram to view this post
VIEW IN TELEGRAM
3
🤕 [SHORT] Коротко о генерации паролей в python

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

Используйте модуль secrets. Почуму? Если коротко, то random создан для симуляции, а результат работы довольно предсказуем. А secrets используется для генерации криптографически надёжных случайных чисел.

Узнать больше можно:

Короткое объяснение — тут

Документаци — тут

———

🧑‍💻 Good coding

#python #secrets #random
Please open Telegram to view this post
VIEW IN TELEGRAM
3
🌡 [RESOURCES] Быть аналитиком данных

Моя подборка, которая поможет, как мне кажется, найти работу в сфере аналитики данных. Я сейчас сам всё это изучаю. Базовый Python уже понятен, нужно было выбирать направление для роста.

1. Актуальный, англоязычный курс — FREE Data Analyst Bootcamp. Если плохо с английским, открывайте плейлист в Яндекс браузере и слушайте в переводе.

2. Подробная карта для изучения инструментов связанных с аналитикой данных — Data Analyst Roadmap

3. Репозиторий с большой подборкой общедоступных наборов данных — awesome-public-datasets

4. Статья на Хабр с подборкой наборов данных - 52 датасета для тренировочных проектов

5. Сайт с большим количество датасетов — kaggle-datasets

———

🧑‍💻 Good coding

#python #resources #datasets #data_analyst
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
🚫 [ERROR] Python не может найти файл init.tcl

Вы можете никогда не использовать tkinter напрямую, но есть библиотеки, которые используют его по умолчания. Например matplotlib — библиотека для визуализации графиков.

Сегодня столкнулся с такой ошибкой:

...
_tkinter.TclError: Can't find a usable init.tcl in the following directories:
...
paths
...
This probably means that Tcl wasn't installed properly.


В моем случае это произошло, потому что вместе с Git я поставил MinGW, который идет вместе с пакетом Git for Windows. А MinGW поставляется с библиотеками Tcl/Tk. Из-за этого возник конфликт в переменных среды. Как я понял, если Git устанавливается на ПК вперед Python, то такого не происходит.

💊 Решение

1. Нажать win+i, что бы открыть настройки

2. Далее путь: Система — О системе — Дополнительные параметры системы — Переменные среды

3. Нажимаем создать в области системных переменных

4. Ввести название переменной: TCL_LIBRARY

5. Указать путь до папки. Что узнать путь, зайдите в диск, на который вы установили Python. Затем в поиске введите tlc. Найдите папку, которая находится в директории Python, а не в Git. В папке будут еще папки. Вам нужна с названием (на момент создания поста) tlc8.6.

В моем случае путь был такой:

C:\Users\Yastrebov\AppData\Local\Programs\Python\Python313\tcl\tcl8.6

6. Осталось сохранить, перезапустить IDE и если у вас была такая же проблема, то она должна решиться

———

🧑‍💻 Good coding

#python #error #tlc #tkinter #matplotlib
Please open Telegram to view this post
VIEW IN TELEGRAM
3
🤕 [SHORT] Сводная таблица как в Excel с помощью pandas

Представим что у на есть некоторый dataset c неопределенным количеством столбцов:

[..., 'Category', 'Region', 'Inventory Level', ...]


Задача: построить сводную таблицу (как на изображении), для отображения остатков (Inventory Level) во всех регионах для каждой категории и отобразить сумму остатков для каждой категории и каждого региона.

В Excel мы бы создали сводную таблицу, перетащили бы Category в область "Cтроки", Region в область "Столбцы", а Inventory Level в область "Значения".

🖥 С применением pandas решение будет выглядеть так:

import pandas as pd

df = pd.read_csv('retail_store_inventory.csv')

pivot_table = df.groupby(['Category', 'Region'])['Inventory Level'].sum().reset_index()

pivot_result = pivot_table.pivot(index='Category', columns='Region', values='Inventory Level')
pivot_result['Total'] = pivot_result.sum(axis=1)
pivot_result.loc['Total'] = pivot_result.sum(axis=0)


Dataset

Ссылка на набор данных

———

🧑‍💻 Good coding!

#python #pandas #data_analitycs #excel
Please open Telegram to view this post
VIEW IN TELEGRAM
2
data.rar
132.6 KB
🌡 [RESOURCES] Dataset. Продукция магазина Калина-Малина

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

Так как в вакансии было указано, что нужно знать pandas, я решил спарсить данные о продуктах с сайта и как раз с помощью pandas что то почистить, проанализировать. Бонусом сделал небольшую презентацию на 5 слайдов с не графиками и аналитикой.

В итоге даже не заслужил фразы "Мы одобрили другого кандидата, а ваше резюме отложили. Если вакансия снова откроется, то мы вам напишем".

Но никакого расстройства, прикольная практика вышла.

Репозиторий

Данные в прикрепе

———

🧑‍💻 Good coding!

#python #pandas #data_analitycs #resources #dataset
Please open Telegram to view this post
VIEW IN TELEGRAM