Как найти одинаковые рядом стоящие элементы

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

Ответы с готовыми решениями:

Найти все стоящие рядом элементы с одинаковыми значениями
Добрый вечер, нужна помощь с 3 задачками.
1)Выполнить действия над массивами. В таблице при…

Определить, есть ли в массиве элементы с одинаковыми значениями, стоящие рядом
41) Заполните массив случайными числами в интервале . Определить, есть ли в нем элементы с…

Определить, есть ли в массиве элементы с одинаковыми значениями, стоящие рядом
Дано задание: Заполните массив случайными числами в интервале . Определить, есть ли в нем элементы…

Определить, есть в массиве элементы с одинаковыми значениями, обязательно стоящие рядом
Прошу помощи! Я молодей студент, помогите написать программу:Определить, есть в массиве элементы с…

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

Что-то не получилось)
Программа:
# -*- coding: utf-8 -*-
import random
mass=[]
mass=[random.randint(0,5) for i in range(5)]
k=0
a=0
print(“Maссив:”,mass)
for i in range (4):
if k==mass[i]:
print(mass[i])
else:
if mass[a]==mass[i+1]:
print(mass[i])
k=mass[i]



0



Fury67

Заяц, просто Заяц.

663 / 277 / 155

Регистрация: 12.11.2017

Сообщений: 866

16.04.2020, 23:02

8

Python
1
if k==mass[i]:

Зачем нужен этот if?

Python
1
if mass[a]==mass[i+1]:

Здесь вы сравниваете первый элемент с 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]:
сравнить 2 числа(текущее и следующее)



0



Fury67

Заяц, просто Заяц.

663 / 277 / 155

Регистрация: 12.11.2017

Сообщений: 866

16.04.2020, 23:06

10

Предлагаю сделать хотя бы так

Python
1
2
3
4
5
6
7
8
import random
 
mass = [random.randint(0, 5) for i in range(5)]
print("Maссив:",mass)
 
for i in range(len(mass) - 1):
    if mass[i] == mass[i + 1]:
        print(mass[i])

Но выдаст ответ четыре нуля, если у нас будет массив полностью из нулей. Как это поправим?



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

Эксперт Python

5407 / 3831 / 1214

Регистрация: 28.10.2013

Сообщений: 9,554

Записей в блоге: 1

16.04.2020, 23:23

13

Лучший ответ Сообщение было отмечено Cybertrack1 как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> def findrepeated(arr):
    i = 0
    while i< len(arr)-1:
        j = 1
        while i+j < len(arr) and arr[i]==arr[i+j]:
            j+=1
        if j > 1: print(arr[i])
        i+=j
 
        
>>> findrepeated([1,2,3])
>>> findrepeated([1,1,2,2,2,3,3,3,4,4,4,5])
1
2
3
4
>>>



0



Fury67

Заяц, просто Заяц.

663 / 277 / 155

Регистрация: 12.11.2017

Сообщений: 866

16.04.2020, 23:26

14

Python
1
2
3
4
5
6
7
8
9
10
11
12
import random
 
mass = [random.randint(0, 5) for i in range(5)]
mass = [0, 0, 0, 1, 1]
a = []
print("Maссив:",mass)
 
for i in range(len(mass) - 1):
    if mass[i] == mass[i + 1]:
        if a.count(mass[i]) == 0:
            a.append(mass[i])
print(a)



0



Эксперт Python

5407 / 3831 / 1214

Регистрация: 28.10.2013

Сообщений: 9,554

Записей в блоге: 1

16.04.2020, 23:29

15

Fury67,
list.count в цикле это плохо. Для небольших списков подойдет, но для больших это очень плохо.



0



Black Fregat

Фрилансер

3704 / 2076 / 567

Регистрация: 31.05.2009

Сообщений: 6,683

16.04.2020, 23:30

16

Python
1
print(*set(u for u, v in zip(arr, arr[1:]) if u == v))



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-*-
k=0
A=[]
A=[1,2,2,2,1,1,2]
print(“Массив:”)
print (A)
for i in range (6):
f=i+1
if A[f]==A[i]:
k=k+1
if k==1:
print(“Есть:”, end=” “)
d=A[i]
c=A[i+1]
A[i+1]=6
print(d, end=” “)
if A[i]==6 and A[i+1]==c:
A[i+1]=6
if k==0:
print (“Нет”)



0



Эксперт Python

5407 / 3831 / 1214

Регистрация: 28.10.2013

Сообщений: 9,554

Записей в блоге: 1

16.04.2020, 23:31

19

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



0



Fury67

Заяц, просто Заяц.

663 / 277 / 155

Регистрация: 12.11.2017

Сообщений: 866

16.04.2020, 23:41

20

Garry Galler, смотри:

Python
1
for i in range(len(mass) - 1):

Это внешний цикл.

Python
1
a.count(mass[i])

Еще один цикл.
Итого цикл в цикле, но второй работает не всегда, так как перед ним есть:

Python
1
if mass[i] == mass[i + 1]:

У вас:

Python
1
while i< len(arr)-1:

Раз цикл.

Python
1
while i+j < len(arr) and arr[i]==arr[i+j]:

Два цикл.
Итого цикл в цикле, которые оба срабатывают считай всегда.

Чем мой вариант хуже? Или где я не прав в рассуждениях?

Добавлено через 5 минут
Хотя я понял, чем ваш вариант лучше. Вы пробегаетесь до первого не такого элемента за самый короткий срок. А этого не избежать, так как все равно перебором искать. Вопрос исчерпан.



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

16.04.2020, 23:41

Помогаю со студенческими работами здесь

Определить, есть ли в массиве элементы с одинаковыми значениями, не обязательно стоящие рядом
Задача:Заполните массив случайными числами. Определить, есть ли в нем элементы с одинаковыми…

Определить, есть ли в массиве элементы с одинаковыми значениями, не обязательно стоящие рядом
Определить, есть ли в массиве элементы с одинаковыми значениями, не обязательно стоящие рядом….

Определить, есть ли в массиве элементы с одинаковыми значениями, не обязательно стоящие рядом
Заполните массив случайными числами. Определить, есть ли в нем элементы с одинаковыми значениями,…

имеются ли в массиве элементы с одинаковыми значениями
Дан двумерный массив Х(6,6) . Определить имеются ли в массиве элементы с одинаковыми значениями…

Есть ли в массиве элементы с одинаковыми значениями
введите массив и определите, есть ли в нём элементы с одинаковыми значениями.

есть ли в массиве элементы с одинаковыми значениями
Составить программу на языке паскаль которая определяет есть ли в массиве элементы с одинаковыми…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

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

Содержание

  1. Введение
  2. Поиск одинаковых элементов в списке с помощью словаря
  3. Поиск одинаковых элементов в списке с помощью модуля collections
  4. Поиск одинаковых элементов в списке с помощью функции filter()
  5. Заключение

Введение

В данной статье разберём три способа нахождения повторяющихся элементов в неупорядоченном списке 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 и возвращает словарь, в котором каждому уникальному элементу списка

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