0 / 0 / 0 Регистрация: 08.04.2020 Сообщений: 23 |
|
1 |
|
Найти элементы с одинаковыми значениями, стоящие рядом16.04.2020, 21:37. Показов 36721. Ответов 21
Заполните массив случайными числами в интервале [0,5]. Определить, есть ли в нем элементы с одинаковыми значениями, стоящие рядом.Пример: Массив: 1 2 3 3 2 1 Есть: 3 Пример: Массив: 1 2 3 4 2 1 Нет Всё что я нашёл в интернете работает не правильно, например если на вводе будет 3 3 3 2 4, то выведет 3 3, а нужно чтобы вывело 3. Как это сделать я не знаю. Прошу помощи!
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
16.04.2020, 21:37 |
Ответы с готовыми решениями: Найти все стоящие рядом элементы с одинаковыми значениями Определить, есть ли в массиве элементы с одинаковыми значениями, стоящие рядом Определить, есть ли в массиве элементы с одинаковыми значениями, стоящие рядом Определить, есть в массиве элементы с одинаковыми значениями, обязательно стоящие рядом 21 |
Заяц, просто Заяц. 663 / 277 / 155 Регистрация: 12.11.2017 Сообщений: 866 |
|
16.04.2020, 22:20 |
2 |
Cybertrack1, помощи в чем? Алгоритм описать?
0 |
0 / 0 / 0 Регистрация: 08.04.2020 Сообщений: 23 |
|
16.04.2020, 22:25 [ТС] |
3 |
Да, хотя бы математическую модель, программу саму не сложно написать.
0 |
Заяц, просто Заяц. 663 / 277 / 155 Регистрация: 12.11.2017 Сообщений: 866 |
|
16.04.2020, 22:29 |
4 |
Для начала вы создаете массив случайных чисел от 1 до 5 размером 5 ячеек. Далее пробегаетесь по массиву с нулевого до предпоследнего элемента, проверяя условие равенства данного элемента следующему. Если равен, то выводим данный элемент. В случае подряд трех одинаковых чисел он выведет два, так как там две пары подряд идущих чисел. Если вам это не нравится, то вы можете записывать в память, какое чисто только что вывели, чтобы потом еще сравнить и с ним следующее (но надо не забыть потом не сравнивать, если чисто не совпадет). Наверное, описал нормально алгоритм.
0 |
0 / 0 / 0 Регистрация: 08.04.2020 Сообщений: 23 |
|
16.04.2020, 22:33 [ТС] |
5 |
Спасибо, сейчас попробую написать программу, если не у меня не получиться обращусь ещё
0 |
Заяц, просто Заяц. 663 / 277 / 155 Регистрация: 12.11.2017 Сообщений: 866 |
|
16.04.2020, 22:35 |
6 |
Cybertrack1, не забудь при обращении код приложить
0 |
0 / 0 / 0 Регистрация: 08.04.2020 Сообщений: 23 |
|
16.04.2020, 22:57 [ТС] |
7 |
Что-то не получилось)
0 |
Fury67 Заяц, просто Заяц. 663 / 277 / 155 Регистрация: 12.11.2017 Сообщений: 866 |
||||||||
16.04.2020, 23:02 |
8 |
|||||||
Зачем нужен этот if?
Здесь вы сравниваете первый элемент с i+1. Зачем?
0 |
0 / 0 / 0 Регистрация: 08.04.2020 Сообщений: 23 |
|
16.04.2020, 23:04 [ТС] |
9 |
а как сделать по другому? это- if k==mass[i]: чтобы предотвратить 3 числа, а это чтобы if mass[a]==mass[i+1]:
0 |
Fury67 Заяц, просто Заяц. 663 / 277 / 155 Регистрация: 12.11.2017 Сообщений: 866 |
||||
16.04.2020, 23:06 |
10 |
|||
Предлагаю сделать хотя бы так
Но выдаст ответ четыре нуля, если у нас будет массив полностью из нулей. Как это поправим?
0 |
0 / 0 / 0 Регистрация: 08.04.2020 Сообщений: 23 |
|
16.04.2020, 23:11 [ТС] |
11 |
Можно менять mass[i+1] на 6 (чтобы исключить совпадение со следующим, т.к. 6 не входит в диапазон)
0 |
Заяц, просто Заяц. 663 / 277 / 155 Регистрация: 12.11.2017 Сообщений: 866 |
|
16.04.2020, 23:19 |
12 |
Не понял вас. Самый простой вариант, как мне кажется, записывать в список те значения, которые мы уже обнаружили. А перед записью их сверять с этим списком на совпадения. Для этого нам надо добавить if на сравнение нашего элемента со всеми элементами списка значений, которые мы уже обнаружили. И при не нахождении данного элемента в нем, добавлять элемент в список.
0 |
Garry Galler 5407 / 3831 / 1214 Регистрация: 28.10.2013 Сообщений: 9,554 Записей в блоге: 1 |
||||
16.04.2020, 23:23 |
13 |
|||
Сообщение было отмечено Cybertrack1 как решение Решение
0 |
Fury67 Заяц, просто Заяц. 663 / 277 / 155 Регистрация: 12.11.2017 Сообщений: 866 |
||||
16.04.2020, 23:26 |
14 |
|||
0 |
5407 / 3831 / 1214 Регистрация: 28.10.2013 Сообщений: 9,554 Записей в блоге: 1 |
|
16.04.2020, 23:29 |
15 |
Fury67,
0 |
Black Fregat Фрилансер 3704 / 2076 / 567 Регистрация: 31.05.2009 Сообщений: 6,683 |
||||
16.04.2020, 23:30 |
16 |
|||
0 |
Заяц, просто Заяц. 663 / 277 / 155 Регистрация: 12.11.2017 Сообщений: 866 |
|
16.04.2020, 23:30 |
17 |
Garry Galler, почему? Он слишком медленный?
0 |
0 / 0 / 0 Регистрация: 08.04.2020 Сообщений: 23 |
|
16.04.2020, 23:30 [ТС] |
18 |
#-*-coding:utf-8-*-
0 |
5407 / 3831 / 1214 Регистрация: 28.10.2013 Сообщений: 9,554 Записей в блоге: 1 |
|
16.04.2020, 23:31 |
19 |
Fury67,
0 |
Fury67 Заяц, просто Заяц. 663 / 277 / 155 Регистрация: 12.11.2017 Сообщений: 866 |
||||||||||||||||||||
16.04.2020, 23:41 |
20 |
|||||||||||||||||||
Garry Galler, смотри:
Это внешний цикл.
Еще один цикл.
У вас:
Раз цикл.
Два цикл. Чем мой вариант хуже? Или где я не прав в рассуждениях? Добавлено через 5 минут
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
16.04.2020, 23:41 |
Помогаю со студенческими работами здесь Определить, есть ли в массиве элементы с одинаковыми значениями, не обязательно стоящие рядом Определить, есть ли в массиве элементы с одинаковыми значениями, не обязательно стоящие рядом Определить, есть ли в массиве элементы с одинаковыми значениями, не обязательно стоящие рядом имеются ли в массиве элементы с одинаковыми значениями Есть ли в массиве элементы с одинаковыми значениями есть ли в массиве элементы с одинаковыми значениями Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 20 |
В этом посте мы обсудим, как найти повторяющиеся элементы в списке в Python.
1. Использование index()
функция
Простое решение состоит в том, чтобы выполнить итерацию по списку с индексами, используя понимание списка, и проверить наличие другого вхождения каждого встреченного элемента, используя index()
функция. Временная сложность этого решения будет квадратичной, а код не обрабатывает повторяющиеся элементы в выводе.
if __name__ == ‘__main__’: nums = [1, 5, 2, 1, 4, 5, 1] dup = [x for i, x in enumerate(nums) if i != nums.index(x)] print(dup) # [1, 5, 1] |
Скачать Выполнить код
2. Использование оператора In
Кроме того, вы можете использовать нарезку с in
оператор для поиска в уже посещенной части списка. Временная сложность решения остается квадратичной и позволяет повторять элементы на выходе.
if __name__ == ‘__main__’: nums = [1, 5, 2, 1, 4, 5, 1] dup = [x for i, x in enumerate(nums) if x in nums[:i]] print(dup) # [1, 5, 1] |
Скачать Выполнить код
3. Использование набора (эффективно)
Чтобы повысить производительность и выполнить работу за линейное время, вы можете использовать set
структура данных.
if __name__ == ‘__main__’: nums = [1, 5, 2, 1, 4, 5, 1] visited = set() dup = [x for x in nums if x in visited or (visited.add(x) or False)] print(dup) # [1, 5, 1] |
Скачать Выполнить код
Чтобы получить каждый дубликат только один раз, вы можете использовать понимание множества, как показано ниже:
if __name__ == ‘__main__’: nums = [1, 5, 2, 1, 4, 5, 1] visited = set() dup = {x for x in nums if x in visited or (visited.add(x) or False)} print(dup) # {1, 5} |
Скачать Выполнить код
4. Использование count()
функция
Вот альтернативное решение с использованием count()
Функция, которая обеспечивает простой и понятный способ выявления дубликатов в списке. Это не рекомендуется для больших списков, поскольку временная сложность является квадратичной.
if __name__ == ‘__main__’: nums = [1, 5, 2, 1, 4, 5, 1] dup = {x for x in nums if nums.count(x) > 1} print(dup) # {1, 5} |
Скачать Выполнить код
5. Использование iteration_utilities
модуль
Наконец, iteration_utilities
модуль предлагает duplicates
функция, которая дает повторяющиеся элементы. Вы можете использовать это как:
from iteration_utilities import duplicates if __name__ == ‘__main__’: nums = [1, 5, 2, 1, 4, 5, 1] dup = list(duplicates(nums)) print(dup) # [1, 5, 1] |
Чтобы получить каждый дубликат только один раз, объедините его с unique_everseen()
:
from iteration_utilities import unique_everseen if __name__ == ‘__main__’: nums = [1, 5, 2, 1, 4, 5, 1] dup = unique_everseen(duplicates(nums)) print(dup) # [1, 5] |
Это все, что касается поиска повторяющихся элементов в списке в Python.
Также см:
Удалить повторяющиеся значения из списка Python
Содержание
- Введение
- Поиск одинаковых элементов в списке с помощью словаря
- Поиск одинаковых элементов в списке с помощью модуля collections
- Поиск одинаковых элементов в списке с помощью функции filter()
- Заключение
Введение
В данной статье разберём три способа нахождения повторяющихся элементов в неупорядоченном списке Python.
Поиск одинаковых элементов в списке с помощью словаря
Для начала создадим неупорядоченный список с числами и пустой словарь:
unordered_list = [6, 6, 8, 7, 5, 1, 4, 5, 4, 7]
duplicate_elements = {}
Теперь пройдёмся по нашему неупорядоченному списку при помощи цикла for. Внутри цикла добавим условие, что если итерабельный элемент присутствует в словаре duplicate_elements, то прибавляем к значению ключа единицу, т.к. этот элемент уже присутствует в словаре, и был найден его дубликат. Если же условие оказалось ложным, то сработает else, где в словарь будет добавляться новый ключ, которого в нём ранее не было:
unordered_list = [6, 6, 8, 7, 5, 1, 4, 5, 4, 7]
duplicate_elements = {}
for item in unordered_list:
if item in duplicate_elements:
duplicate_elements[item] += 1
else:
duplicate_elements[item] = 1
Выведем результат:
unordered_list = [6, 6, 8, 7, 5, 1, 4, 5, 4, 7]
duplicate_elements = {}
for item in unordered_list:
if item in duplicate_elements:
duplicate_elements[item] += 1
else:
duplicate_elements[item] = 1
print(duplicate_elements)
# Вывод: {6: 2, 8: 1, 7: 2, 5: 2, 1: 1, 4: 2}
В выводе мы видим, что было найдено две шестёрки, одна восьмёрка, две семёрки, две пятёрки, одна единица и две четвёрки.
Поиск одинаковых элементов в списке с помощью модуля collections
В данном способе для поиска одинаковых элементов в неупорядоченном списке мы будем использовать модуль collections, а точнее класс Counter из него. Сам модуль входит в стандартную библиотеку Python, поэтому устанавливать его не придётся.
Для начала импортируем сам модуль collections и добавим неупорядоченный список:
import collections
unordered_list = [6, 6, 8, 7, 5, 1, 4, 5, 4, 7]
Далее при помощи класса Counter из модуля collections подсчитаем количество повторяющихся элементов:
import collections
unordered_list = [6, 6, 8, 7, 5, 1, 4, 5, 4, 7]
count_frequency = collections.Counter(unordered_list)
Выведем результат в виде словаря:
import collections
unordered_list = [6, 6, 8, 7, 5, 1, 4, 5, 4, 7]
count_frequency = collections.Counter(unordered_list)
print(dict(count_frequency))
# Вывод: {6: 2, 8: 1, 7: 2, 5: 2, 1: 1, 4: 2}
Поиск одинаковых элементов в списке с помощью функции filter()
В данном способе мы просто будем выводить повторяющиеся элементы в списке, но не указывать количество их повторений.
При помощи функции filter() отфильтруем наш список. Внутри неё анонимной функцией lambda будем производить проверку поэлементно, и если определённый элемент встречается больше одного раза, мы добавляем его в count_frequency:
unordered_list = [6, 6, 8, 7, 5, 1, 4, 5, 4, 7]
count_frequency = filter(lambda x: unordered_list.count(x) > 1, unordered_list)
При помощи функции set() преобразуем полученные данные в count_frequency в множество, а множество в список:
unordered_list = [6, 6, 8, 7, 5, 1, 4, 5, 4, 7]
count_frequency = filter(lambda x: unordered_list.count(x) > 1, unordered_list)
count_frequency = list(set(count_frequency))
Выведем полученный результат:
unordered_list = [6, 6, 8, 7, 5, 1, 4, 5, 4, 7]
count_frequency = filter(lambda x: unordered_list.count(x) > 1, unordered_list)
count_frequency = list(set(count_frequency))
print(count_frequency)
# Вывод: [4, 5, 6, 7]
Т.е. в неупорядоченном списке повторяются четвёрки, пятёрки, шестёрки и семёрки.
Заключение
В ходе статьи мы с Вами разобрали целых три способа нахождения повторяющихся элементов в списке Python. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂
#статьи
- 23 янв 2023
-
0
Задача: проверить массив на дубликаты
Решаем задачи, которые дают программистам на собеседованиях в IT-компаниях. Сегодня ищем в массиве повторяющиеся элементы.
Иллюстрация: Polina Vari для Skillbox Media
Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.
Условие. Дан массив целых чисел — nums. Необходимо написать функцию, которая возвращает true, если в этом массиве хотя бы одно число повторяется дважды. Если же все элементы уникальны, функция должна вернуть false.
Ввод: nums = [1,2,3,1] Вывод: true
Ввод: nums = [1,2,3,4] Вывод: false
Ввод: nums = [1,1,1,3,3,4,3,2,4,2] Вывод: true
Решить эту задачу самостоятельно и на разных языках программирования можно на LeetCode. Наше решение взято из телеграм-канала Сергея Cracking code interview.
Решение
При решении подобных задач важно выбрать подходящий тип данных. Здесь мы исходим из такой логики: «повторяется дважды» → значит, ищем дубликаты. Следовательно, выбираем множество (set).
Мы создадим пустое множество и будем обходить весь массив, просто проверяя, находится ли элемент во множестве:
- если он ещё не находится — добавляем его;
- если элемент уже там — значит, мы встретили повторяющийся элемент и просто возвращаем true.
public boolean containsDuplicate(int[] nums) { Set<Integer> set = new HashSet<>(); for (int i : nums) { if (set.contains(i)) { return true; } else { set.add(i); } } return false; }
Результаты
Временная сложность: O(n) — так как в самом плохом случае мы проходимся по всему массиву.
Ёмкостная сложность: O(1) — нам нужно заранее определённое количество места в памяти.
Научитесь: Профессия Java-разработчик
Узнать больше
Один из способов решения этой задачи – использовать словарь. Можно создать словарь, в котором каждому элементу списка соответствует количество его повторений, и в цикле перебрать элементы списка, добавляя их в словарь.
Вот пример такой функции:
def count_repeats(lst):
"""
Возвращает словарь, в котором каждому элементу списка lst соответствует
количество его повторений.
"""
repeats = {}
for item in lst:
if item in repeats:
repeats[item] += 1
else:
repeats[item] = 1
return repeats
# Пример использования функции
lst = [10, 10, 23, 10, 123, 66, 78, 123]
repeats = count_repeats(lst)
print(repeats) # {10: 3, 123: 2}
Функция count_repeats
принимает на вход список lst
, перебирает его элементы и добавляет их в словарь repeats
. Если элемент уже есть в словаре, то увеличивается значение соответствующей пары ключ-значение, если же элемента еще нет в словаре, то добавляется пара с ключом равным этому элементу и значением 1
.
Вы можете использовать эту функцию, чтобы найти повторяющиеся элементы в списке и количество их повторений.
Вы также можете использовать функцию Counter из модуля collections, чтобы посчитать количество повторений элементов списка. Эта функция возвращает словарь, в котором каждому элементу списка соответствует количество его повторений.
Вот пример кода, который использует функцию Counter:
from collections import Counter
def count_repeats(lst):
"""
Возвращает словарь, в котором каждому элементу списка lst соответствует
количество его повторений.
"""
return Counter(lst)
# Пример использования функции
lst = [10, 10, 23, 10, 123, 66, 78, 123]
repeats = count_repeats(lst)
print(repeats) # Counter({10: 3, 123: 2})
В этом коде сначала импортируется модуль collections
и функция Counter
, а затем определяется функция count_repeats
, которая принимает список lst
и возвращает результат вызова функции Counter
на этом списке.
Вы также можете использовать функцию most_common
из модуля collections
, чтобы найти топ-N самых часто встречающихся элементов в списке. Эта функция принимает список и число N, и возвращает список кортежей, каждый из которых содержит элемент и количество его повторений.
Вот пример кода, который использует функцию most_common
:
from collections import Counter
def find_top_repeats(lst, n):
"""
Возвращает топ-N самых часто встречающихся элементов в списке lst.
"""
return Counter(lst).most_common(n)
# Пример использования функции
lst = [10, 10, 23, 10, 123, 66, 78, 123]
top_repeats = find_top_repeats(lst, 2)
print(top_repeats) # [(10, 3), (123, 2)]
В этом коде сначала импортируется модуль collections
и функция Counter
, а затем определяется функция find_top_repeats
, которая принимает список lst
и число n
, и возвращает результат вызова функции most_common
Если вам нужно найти только уникальные элементы в списке, то можете использовать функцию set. Эта функция создает множество из элементов списка, удаляя повторяющиеся элементы. Множество не содержит повторяющихся элементов, поэтому вы можете использовать его, чтобы найти уникальные элементы в списке.
Вот пример кода, который использует функцию set
:
def find_unique(lst):
"""
Возвращает список уникальных элементов в списке lst.
"""
return list(set(lst))
# Пример использования функции
lst = [10, 10, 23, 10, 123, 66, 78, 123]
unique = find_unique(lst)
print(unique) # [66, 78, 10, 123, 23]
В этом коде определяется функция find_unique
, которая принимает список lst
и возвращает список уникальных элементов. Для этого список преобразуется в множество
Если вам нужно найти только уникальные элементы в списке и посчитать их количество, то можете соединить два предыдущих подхода: сначала использовать функцию set
для нахождения уникальных элементов, а затем функцию count_repeats
для подсчета их количества.
Вот пример кода, который реализует этот подход:
def count_unique(lst):
"""
Возвращает словарь, в котором каждому уникальному элементу списка lst соответствует
количество его повторений.
"""
repeats = {}
for item in set(lst):
repeats[item] = lst.count(item)
return repeats
# Пример использования функции
lst = [10, 10, 23, 10, 123, 66, 78, 123]
unique_counts = count_unique(lst)
print(unique_counts) # {66: 1, 78: 1, 10: 3, 123: 2}
В этом коде определяется функция count_unique
, которая принимает список lst
и возвращает словарь, в котором каждому уникальному элементу списка