Задания Python Flashcards
Пусть даны 2 списка длины n и m, содержащие целые числа.
Выведите на экран элементы, которые встречаются в обоих.
Теги #купер
1
def common_elements(list1, list2):
return sorted(set(list1) & set(list2)) # Используем & для нахождения пересечения множеств
пример
a = [1, 3, 5, 7, 9]
b = [2, 3, 6, 7, 10]
print(common_elements(a, b)) # Выведет: [3, 7]
2
Если важно учитывать количество вхождений элементов:
Сохраняет количество повторений из обоих списков.
def common_elements(list1, list2):
result = []
for num1 in list1:
for num2 in list2:
if num1 == num2 and num1 not in result:
result.append(num1)
print(result)
пример
list1 = [3, 5, 2, 8, 5]
list2 = [9, 2, 3, 7, 3]
common_elements(list1, list2)
дан список arr = [3, 5, 1, 4, -5, -9, -12] и таргет target = 9
нужно вывести индексы из списка в формате (i, j) которые в сумме дадут таргет
*сначала думал что то написать по сложнее, но по производительнее, но решил забросить это так как времени мало.
Решение - цикл в цикле, если попадется, можете через словарь решить, плюс баллы будут однозначно
теги #собес
def two_sum_indices_double_loop(arr, target):
result = []
for i in range(len(arr)):
for j in range(i + 1, len(arr)):
if arr[i] + arr[j] == target:
result.append((i, j))
return result
Пример запуска
arr = [3, 5, 1, 4, -5, -9, -12]
target = 9
pairs = two_sum_indices_double_loop(arr, target)
print(pairs) # Выведет все пары индексов, где arr[i] + arr[j] == 9
2
def two_sum_indices_dict(arr, target):
seen = {} # словарь: число -> индекс
result = []
for i, num in enumerate(arr): needed = target - num if needed in seen: # Это значит, что arr[seen[needed]] + num == target j = seen[needed] result.append((j, i)) # (индекс найденного ранее числа, текущий индекс) Добавляем текущий элемент в словарь (так как теперь он будет "просмотренным" для следующих итераций) seen[num] = i return result
Пример запуска
arr = [3, 5, 1, 4, -5, -9, -12]
target = 9
pairs_dict_approach = two_sum_indices_dict(arr, target)
print(pairs_dict_approach) # Выведет все пары (i, j), где i < j
табилца логов
дата, юзеры
2023-05-01 12:32:33, 1
2023-05-01 15:12:24, 2
2023-05-01 18:45:03, 1
2023-05-02 11:02:13, 1
2023-05-03 12:31:45, 3
вывести дату и накопительную сумму уникальных пользователей
Теги #собес
import pandas as pd
Создаем DataFrame из логов
data = {
“дата”: [
“2023-05-01 12:32:33”,
“2023-05-01 15:12:24”,
“2023-05-01 18:45:03”,
“2023-05-02 11:02:13”,
“2023-05-03 12:31:45”
],
“юзеры”: [1, 2, 1, 1, 3]
}
df = pd.DataFrame(data)
Преобразуем столбец с датой в формат datetime
df[“дата”] = pd.to_datetime(df[“дата”])
Оставляем только дату без времени
df[“дата”] = df[“дата”].dt.date
Накапливаем уникальных пользователей
unique_users = set()
cumulative_counts = []
for date in sorted(df[“дата”].unique()):
users_on_date = df[df[“дата”] == date][“юзеры”].unique()
unique_users.update(users_on_date)
cumulative_counts.append((date, len(unique_users)))
Создаем итоговый DataFrame
result_df = pd.DataFrame(cumulative_counts, columns=[“дата”, “накопительное_число_уникальных_пользователей”])
Написать функцию, которая определяет, является ли переданная строка палиндромом
(читается слева-направо и справа-налево одинаково).
Примеры палиндромов:
- Казак
- А роза упала на лапу Азора
- Do geese see God?
- Madam, I’m Adam
Ограничение по памяти O(1).
“””
Теги # Яндекс
def is_palindrome(s: str) -> bool:
left, right = 0, len(s) - 1
while left < right: while left < right and not s[left].isalnum(): # Пропускаем неалфанумерные символы left += 1 while left < right and not s[right].isalnum(): # Пропускаем неалфанумерные символы right -= 1 if s[left].lower() != s[right].lower(): # Сравниваем символы без учета регистра return False left += 1 right -= 1 return True
Примеры использования
examples = [
“Казак”,
“А роза упала на лапу Азора”,
“Do geese see God?”,
“Madam, I’m Adam”,
“Hello, world!”
]
for example in examples:
print(f’“{example}” -> {is_palindrome(example)}’)
”””
Дан список целых чисел, повторяющихся элементов в списке нет.
Нужно преобразовать это множество в строку,
сворачивая соседние по числовому ряду числа в диапазоны.
Примеры:
- [1, 4, 5, 2, 3, 9, 8, 11, 10] => “0-5,8-9,11”
- [1, 4, 3, 2] => “1-4”
“””
Теги # Яндекс
def compress_ranges(nums):
if not nums:
return “”
# Сортируем числа nums = sorted(set(nums)) # Переменные для хранения диапазонов ranges = [] start = nums[0] end = nums[0] # Проходим по отсортированному списку for i in range(1, len(nums)): if nums[i] == end + 1: end = nums[i] else: ranges.append(f"{start}-{end}" if start != end else f"{start}") start = end = nums[i] # Добавляем последний диапазон ranges.append(f"{start}-{end}" if start != end else f"{start}") return ",".join(ranges)
Примеры
example_1 = [1, 4, 5, 2, 3, 9, 8, 11, 10]
example_2 = [1, 4, 3, 2]
Вывод результатов
compress_ranges(example_1), compress_ranges(example_2)
Дан массив интов. Необходимо найти максимальное число из массива, которое встречается в массиве только один раз. #Авито
nums = [5,7,3,9,4,9,8,3,1] → 8
1
from collections import Counter
Исходный массив
nums = [5, 7, 3, 9, 4, 9, 8, 3, 1]
Подсчет количества вхождений каждого числа
counts = Counter(nums)
Фильтруем только те числа, которые встречаются один раз
unique_nums = [num for num, count in counts.items() if count == 1]
Находим максимальное число среди уникальных
max_unique = max(unique_nums) if unique_nums else None
Вывод результата
max_unique
2
Исходный массив
nums = [5, 7, 3, 9, 4, 9, 8, 3, 1]
Создаем словарь для подсчета вхождений
frequency = {}
Заполняем словарь количеством вхождений каждого числа
for num in nums:
if num in frequency:
frequency[num] += 1
else:
frequency[num] = 1
Фильтруем только те числа, которые встречаются один раз
unique_nums = [num for num in nums if frequency[num] == 1]
Находим максимальное число среди уникальных
max_unique = max(unique_nums) if unique_nums else None
Вывод результата
max_unique
Реализуйте один из известных физических типов джойнов на примере двух числовых последовательностей (merge join). #Авито
left_ids = [20, 40, 50, 60]
right_ids = [5, 20, 25, 45, 50]
Есть поток событий (в каждом событии есть два поля: ts, user_id).
Нужно написать сервис, который обрабатывает этот поток событий и отвечает на вопрос, сколько пользователей совершило больше 1000 событий за последние 15 минут. События поступают real-time #Авито
from pyspark.sql import SparkSession
from pyspark.sql.functions import window, count, col
from pyspark.sql.types import StructType, StructField, TimestampType, StringType
Создаём Spark сессию
spark = SparkSession.builder \
.appName(“RealTimeUserEventProcessor”) \
.getOrCreate()
Определяем схему входных данных
schema = StructType([
StructField(“ts”, TimestampType(), True),
StructField(“user_id”, StringType(), True)
])
Читаем поток данных из Kafka
df = spark.readStream \
.format(“kafka”) \
.option(“kafka.bootstrap.servers”, “kafka:9092”) \
.option(“subscribe”, “user_events”) \
.option(“startingOffsets”, “latest”) \
.load()
Преобразуем JSON-сообщения в структуру данных
events = df.selectExpr(“CAST(value AS STRING)”) \
.selectExpr(“from_json(value, ‘ts TIMESTAMP, user_id STRING’) AS data”) \
.select(“data.*”)
Подсчитываем количество событий для каждого пользователя за последние 15 минут
windowed_counts = events \
.groupBy(window(col(“ts”), “15 minutes”), col(“user_id”)) \
.agg(count(“user_id”).alias(“event_count”))
Фильтруем пользователей, у которых больше 1000 событий
high_activity_users = windowed_counts.filter(col(“event_count”) > 1000)
Подсчитываем количество таких пользователей
user_count = high_activity_users.select(count(“user_id”).alias(“active_users”))
Запускаем потоковую обработку с выводом в консоль
query = user_count.writeStream \
.outputMode(“complete”) \
.format(“console”) \
.start()
query.awaitTermination()
wildberries
Написать функцию. Нужно вернуть список цифр, сумма которого которого будет равно входному числу. Входное число - натуральное до миллиона.
Пример 1:
Вход: 10
Выход: 5,5
Пример 2:
Вход: 16
Выход: 4,5,1,6
Нужно написать ф-ию который бы проверял наше предыдущее решение, но не используя знак + и sum
Вход: 16, [4,5,1,6]
Выход: True
import itertools
def split_number(n):
“"”Разбивает число на список чисел, сумма которых равна n”””
parts = []
remaining = n
while remaining > 0: part = min(remaining, 5) # Берем части до 5, чтобы разнообразить разбиение parts.append(part) remaining -= part return parts
def check_split(n, numbers):
“"”Проверяет, равна ли сумма элементов numbers числу n без использования + и sum”””
def recursive_add(arr, idx=0): if idx == len(arr): return 0 return arr[idx] - (-recursive_add(arr, idx + 1)) # Используем двойное отрицание вместо сложения return n == recursive_add(numbers)
Примеры
num = 16
split_result = split_number(num)
print(f”Разбиение числа {num}: {split_result}”)
print(f”Проверка: {check_split(num, split_result)}”)
num2 = 10
split_result2 = split_number(num2)
print(f”Разбиение числа {num2}: {split_result2}”)
print(f”Проверка: {check_split(num2, split_result2)}”)
s = ‘мамы нет Дома’
получи обратную строку не больше 1 секунды
Time Complexity = O(N)
Space Complexity = O(N)
теги #ПетровичТех
s = ‘мамы нет Дома’
reversed_s = s[::-1] # O(N) по времени и памяти
print(reversed_s)
def reverse_string(s):
return ‘‘.join(reversed(s)) # O(N) по времени и памяти
print(reverse_string(s))
Задание на Python: Написать функцию для нахождения уникальных комбинаций в списке словарей и подсчета частоты этих комбинаций.
#🐺
from collections import Counter
from typing import List, Dict, Tuple
def count_unique_combinations(data: List[Dict]) -> Dict[Tuple, int]:
“””
Находит уникальные комбинации значений в списке словарей и подсчитывает частоту их встречаемости.
:param data: Список словарей с одинаковыми ключами.
:return: Словарь, где ключ - кортеж значений, а значение - частота встречаемости.
“””
if not data:
return {}
# Извлекаем только значения и преобразуем их в кортежи для подсчета value_tuples = [tuple(d.values()) for d in data] # Подсчитываем частоту встречаемости уникальных комбинаций combination_counts = Counter(value_tuples) return dict(combination_counts)
Пример использования
data = [
{“name”: “Alice”, “age”: 25, “city”: “NY”},
{“name”: “Bob”, “age”: 30, “city”: “LA”},
{“name”: “Alice”, “age”: 25, “city”: “NY”},
{“name”: “Alice”, “age”: 27, “city”: “NY”},
{“name”: “Bob”, “age”: 30, “city”: “LA”}
]
result = count_unique_combinations(data)
print(result)
s = “Abc CbA Vrd bbb cEc Vbv ecC ECC” (сложный)
легкий - тоже самое только в нижнем регистре
какие 3 символа чаще встречают
#betboom
1
from collections import Counter
Исходные строки
s_complex = “Abc CbA Vrd bbb cEc Vbv ecC ECC”
s_simple = s_complex.lower()
Подсчет частоты символов
counter_complex = Counter(s_complex.replace(“ “, “”)) # Убираем пробелы
counter_simple = Counter(s_simple.replace(“ “, “”))
Определяем 3 самых частых символа
top3_complex = counter_complex.most_common(3)
top3_simple = counter_simple.most_common(3)
top3_complex, top3_simple
2
Подсчет частоты символов без использования Counter
def count_chars(s):
char_freq = {}
for char in s.replace(“ “, “”): # Убираем пробелы
if char in char_freq:
char_freq[char] += 1
else:
char_freq[char] = 1
return sorted(char_freq.items(), key=lambda x: x[1], reverse=True)[:3]
Анализируем сложный и легкий вариант
top3_complex_no_counter = count_chars(s_complex)
top3_simple_no_counter = count_chars(s_simple)
top3_complex_no_counter, top3_simple_no_counter
Имеется переменная my_str с текстом типа: “/a /a/b /a/b/c /a/d /a/d/e” и т.д.
Python-задача:
# Где пробел разделитель между значениями, а / разделитель между элементами (parent-childe зависимость).
# Нужно сделать список my_list, в котором строка будет разбита по пробелам,
# и список отсортирован по увеличению количества символов в элементах( “/a”, “/a/b”, “/a/d”, “/a/b/c”, “/a/d/e”)
my_str = “/a /a/bb /a/bb/c /a/d /a/d/e”
теги #glowbyte
my_str = “/a /a/bb /a/bb/c /a/d /a/d/e”
Разбиваем строку по пробелам и сортируем по длине строк
my_list = sorted(my_str.split(), key=len)
Вывод результата
print(my_list)
Если нужно учитывать порядок следования родителей и детей при одинаковой длине, можно отсортировать сначала по длине, затем по алфавиту:
my_list = sorted(my_str.split(), key=lambda x: (len(x), x))
print(my_list)
{“a”: {“bb”: {“c”: None}, “d”: {“e”: None}}}
написать функцию, которая преобразует список в дерево (словарь), где будут все элементы слева направо от родителя к потомкам:
теги #glowbyte
Python
Приходит строка с буквами A-Z типа AAAABBBBCCCCD
Нужно вернуть строку A4B4C4D(посчитать буквы)
Если строка некорректная, нужно вернуть ошибку
теги #X5
Вернуть список цифр, сумма которого будет равна входному числу. Входное число - натуральное до миллиона(да, так просто)
теги #wildberries
Написать функцию которая бы проверяла предыдущее решение (Вернуть список цифр, сумма которого будет равна входному числу. Входное число - натуральное до миллиона(да, так просто)) , но без использования знака + и sum(можно двойное отрицание сделать, тоже просто очень)
теги #wildberries
wildberries
”"”Нужно преобразовать в датафрейм со столбцами:
product_id, product_name, report_dt, order_cnt, order_cancel_cnt, revenue_val”””
# 12345, Product_1, 2024-04-01, 1, 2, 122
собес
- лайвкодинг Python
def get_classes(data: str) -> dict[str: list[str]]:
“””
Имеется строка с валидным json телом с двумя списками равной длины.
В первом имена учеников, во втором классы, в которых они числяться
Необходимо реализовать функцию, которая вернет dict,
вида {class: list(pupils)}.
Можно импортировать и пользоваться стандартными библиотеками.
“””
pass
data = ‘’’{
“pupil_names”: [“Alice”, “Bob”, “Charlie”, “David”, “Emma”, “Frank”, “Grace”, “Henry”, “Ivy”, “Jack”, “Alice”, “Charlie”, “Frank”],
“classes”: [“A”, “B”, “C”, “D”, “A”, “B”, “C”, “D”, “A”, “B”, “A”, “D”, “A”]
}’’’
print(get_classes(data))
# for class_name, pupils in get_classes(data).items():
# print(f’{class_name} class pupils:\n {pupils}’)
”””
Example output:
{
‘A’: [‘Alice’, ‘David’],
‘B’: […]
…
}
“””
Написать сортировка пузырьком, быструю сортировку, сортировку слиянием #HalltapeRoadmapDE
def bubble_sort(arr):
“"”Пузырьковая сортировка”””
n = len(arr)
for i in range(n):
swapped = False
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
swapped = True
if not swapped:
break # Если не было обменов, массив уже отсортирован
return arr
def quick_sort(arr):
“"”Быстрая сортировка (с использованием метода Хоара)”””
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
def merge_sort(arr):
“"”Сортировка слиянием”””
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
“"”Функция слияния двух отсортированных массивов”””
result = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result.extend(left[i:])
result.extend(right[j:])
return result
Пример использования
arr = [64, 34, 25, 12, 22, 11, 90]
print(“Пузырьковая сортировка:”, bubble_sort(arr[:]))
print(“Быстрая сортировка:”, quick_sort(arr[:]))
print(“Сортировка слиянием:”, merge_sort(arr[:]))
Описание алгоритмов:
Пузырьковая сортировка (Bubble Sort) — простой, но неэффективный алгоритм с временной сложностью O(n²), который проходит по массиву и попарно меняет элементы, если они расположены в неправильном порядке. Быстрая сортировка (Quick Sort) — использует стратегию "разделяй и властвуй", выбирает опорный элемент (pivot) и рекурсивно сортирует элементы слева и справа от него. В среднем работает за O(n log n). Сортировка слиянием (Merge Sort) — также использует "разделяй и властвуй", разбивая массив на подмассивы, сортируя их рекурсивно и сливая обратно. Гарантированная сложность O(n log n).
Функцию, которая принимает список, а на выходе должна возвращать среднее арифметическое из значений списка.
Нужно написать ф-ию который бы проверял наше предыдущее решение, но не используя знак + и sum
теги # Екатерина
Есть 2 отсортированных списка. Надо их объединить и получить отсортированный теги # Екатерина
На вход программе подается список элементов из названия цветов ‘rose’,’black’, ‘red’,’green’, ‘grey’,’blue’, в случайном порядке.Необходимо вывезти в порядке RGB (сначала все слова на букву R, затем G и B).При этом каждый набор элементов R, G, должен быть упорядочен по алфавиту. # Екатерина
Имеется строка с валидным json телом с двумя списками равной длины.
В первом имена учеников, во втором классы, в которых они числяться
Необходимо реализовать функцию, которая вернет dict,
вида {class: list(pupils)}.
Можно импортировать и пользоваться стандартными библиотеками.
“””
pass
data = ‘’’{
“pupil_names”: [“Alice”, “Bob”, “Charlie”, “David”, “Emma”, “Frank”, “Grace”, “Henry”, “Ivy”, “Jack”, “Alice”, “Charlie”, “Frank”],
“classes”: [“A”, “B”, “C”, “D”, “A”, “B”, “C”, “D”, “A”, “B”, “A”, “D”, “A”]
}’’’
print(get_classes(data))
# for class_name, pupils in get_classes(data).items():
# print(f’{class_name} class pupils:\n {pupils}’)
”””
Example output:
{
‘A’: [‘Alice’, ‘David’],
‘B’: […]
…
}
теги #собес