Нужно вернуть список который состоит из элементов общих для этих двух списков python
Перейти к содержимому

Нужно вернуть список который состоит из элементов общих для этих двух списков python

  • автор:

Name already in use

python-elementary / task_2.py /

  • Go to file T
  • Go to line L
  • Go to definition R
  • Copy path
  • Copy permalink

1 contributor

Users who have contributed to this file

  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents

Copy raw contents

Copy raw contents

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

Задача по Python

Нужно вернуть список, который состоит из элементов, общих для этих двух списков.

Мы можем воспользоваться циклом for :

Или функцией filter :

Или списковым включением:

result = [elem for elem in a if elem in b]

А можно привести оба списка к множествам и найти их пересечение:

result = list(set(a) & set(b))

Однако в таком случае каждый элемент встретится в результирующем списке лишь один раз, т.к. множество поддерживает уникальность входящих в него элементов. Первые два решения (с фильтрацией) оставят все дубли на своих местах.

Задачи по Python для начинающих от Tproger и GeekBrains

Вместе с факультетом Python-разработки GeekUniversity собрали для вас несколько простых задач по Python для обучения и тренировки. Их можно решать в любом порядке.

Обратите внимание, что у любой задачи по программированию может быть несколько способов решения. Чтобы посмотреть добавленный нами вариант решения, кликните по соответствующей кнопке. Все приведённые варианты написаны на Python 3.

Задача 1

Есть список a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] .

Выведите все элементы, которые меньше 5 .

Самый простой вариант, который первым приходит на ум — использовать цикл for :

Также можно воспользоваться функцией filter , которая фильтрует элементы согласно заданному условию:

И, вероятно, наиболее предпочтительный вариант решения этой задачи — списковое включение:

print([elem for elem in a if elem < 5])

Задача 2

a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] ;

b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] .

Нужно вернуть список, который состоит из элементов, общих для этих двух списков.

Можем воспользоваться функцией filter :

Или списковым включением:

result = [elem for elem in a if elem in b]

А можно привести оба списка к множествам и найти их пересечение:

result = list(set(a) & set(b))

Однако в таком случае каждый элемент встретится в результирующем списке лишь один раз, т.к. множество поддерживает уникальность входящих в него элементов. Первые два решения (с фильтрацией) оставят все дубли на своих местах.

Python RegEx: практическое применение регулярок

Задача 3

Отсортируйте словарь по значению в порядке возрастания и убывания.

Импортируем нужный модуль и объявляем словарь:

Сортируем в порядке возрастания:

И в порядке убывания:

Задача 4

Напишите программу для слияния нескольких словарей в один.

Допустим, вот наши словари:

Объединить их можно вот так:

А можно с помощью «звёздочного» синтаксиса:

О звёздочном синтаксисе можно прочитать в нашей статье.

Задача 5

Найдите три ключа с самыми высокими значениями в словаре my_dict = <'a':500, 'b':5874, 'c': 560,'d':400, 'e':5874, 'f': 20>.

Можно воспользоваться функцией sorted :

Аналогичный результат можно получить с помощью функции nlargest из модуля heapq :

Задача 6

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

Второй аргумент функции int отвечает за указание основания системы счисления:

Задача 7

Нужно вывести первые n строк треугольника Паскаля. В этом треугольнике на вершине и по бокам стоят единицы, а каждое число внутри равно сумме двух расположенных над ним чисел.

Задача 8

Напишите проверку на то, является ли строка палиндромом. Палиндром — это слово или фраза, которые одинаково читаются слева направо и справа налево.

Тут всё просто, достаточно сравнить строку с её обратной версией, для чего можно использовать встроенную функцию reversed:

Того же эффекта можно добиться с помощью срезов:

Задача 9

Сделайте так, чтобы число секунд отображалось в виде дни:часы:минуты:секунды .

Задача 10

Вы принимаете от пользователя последовательность чисел, разделённых запятой. Составьте список и кортеж с этими числами.

Задача 11

Выведите первый и последний элемент списка.

Задача 12

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

Задача 13

При заданном целом числе n посчитайте n + nn + nnn.

Задача 14

Напишите программу, которая выводит чётные числа из заданного списка и останавливается, если встречает число 237.

Задача 15

Напишите программу, которая принимает два списка и выводит все элементы первого, которых нет во втором.

Задача 16

Выведите список файлов в указанной директории.

Задача 17

Сложите цифры целого числа.

Задача 18

Посчитайте, сколько раз символ встречается в строке.

Задача 19

Поменяйте значения переменных местами.

Можно написать монструозную конструкцию в стиле языка C:

Но в Python есть более удобный способ для решения этой задачи:

Задача 20

С помощью анонимной функции извлеките из списка числа, делимые на 15.

Задача 21

Нужно проверить, все ли числа в последовательности уникальны.

Задача 22

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

Хотите вырасти от новичка до профессионала? Факультет Python-разработки GeekUniversity даёт год опыта для вашего резюме. Обучайтесь на практических заданиях, по-настоящему освойте Python и станьте ближе к профессии мечты.

Узнать больше

Определение наиболее эффективного решения нахождения общих элементов двух списков

a , b — списки, отсортированные по возрастанию. Вернуть список c , содержащий только те элементы из a , которые есть в b . Решение должно быть вычислительно эффективным.

Кто знает, какие недостатки в решениях этой задачи? Кто может предложить более лучший и эффективный вариант решения этой задачи? Оптимальный по скорости вычисления. И как оценить вычислительную сложность данных решений?

strawdog's user avatar

Разницу в производительности можно измерить например с помощью библиотеки timeit .

S. Nick's user avatar

Оптимально будет использовать алгоритм двух указателей:

Этот алгоритм проходит по каждому элементу из двух массивов не более одного раза, поэтому должен быть побыстрее множеств. Сложность — O(len(a) + len(b)), то есть O(N).

Ваши решения имеют сложности O(NlogN) и O(N^2) соответственно. Первый использует сортировку, второй — по сути двойной цикл.

По вычислительной сложности

Основные параметры вычислительной сложности над различными типами массивов можно прочитать на питоновской Wiki в разделе TimeComplexity . Дальше комбинируете с тем, что у Вас в алгоритме реализуется и тем, что реализовано в сторонних функциях и классах.

По Вашему примеру. Если где ошибаюсь, то надеюсь коллеги поправят.

Вариант 1) Если преобразуем список ( list ) в множество ( set ), то стоимость операции O(n) . Далее пересечение O(min(len(s), len(t)) , если равны, то O(n) , а потом снова в преобразуем список O(n) . И последнее сортировка списка O(n log n) . Итого в худшем случае O(n) + O(n) + O(n) + O(n) + O(n) + O(n log n)

Вариант 2) Первый цикл O(n) , попадание в список O(n) , append() со стоимостью одной операции O(1) . Где-то итого приблизительно будет O(n^2) + O(n)

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

Протестировать

Протестировать все это можно с помощью timeit или библиотеки timench . Пример кода для второй в этом гисте по ссылке https://gist.github.com/ndrwpvlv/d011e129ffdb3816caad8dff74517e86. Там же внизу результаты для упорядоченных и случайных списков длиной три ячейки и тысяча. С ростом длины соответственно вариант с множествами дает меньше временных затрат.

По timeit примеры в соседнем посте.

По оптимальному варианту. На мой взгляд, если нужна сортировка, то чуть эффективнее будет

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *