Как найти наибольшее количество повторяющихся

Use groupby, it group elements by value:

from itertools import groupby
group = groupby([1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1])
print max(group, key=lambda k: len(list(k[1])))

And here is the code in action:

>>> group = groupby([1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1])
>>> print max(group, key=lambda k: len(list(k[1])))
(2, <itertools._grouper object at 0xb779f1cc>)
>>> group = groupby([1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1, 3, 3, 3, 3, 3])
>>> print max(group, key=lambda k: len(list(k[1])))
(3, <itertools._grouper object at 0xb7df95ec>)

From python documentation:

The operation of groupby() is similar
to the uniq filter in Unix. It
generates a break or new group every
time the value of the key function
changes

# [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
# [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D

If you also want the index of the longest run you can do the following:

group = groupby([1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1, 3, 3, 3, 3, 3])
result = []
index = 0
for k, g in group:
   length = len(list(g))
   result.append((k, length, index))
   index += length

print max(result, key=lambda a:a[1])

0 / 0 / 0

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

Сообщений: 28

1

Как посчитать и вывести наибольшее число повторяющихся элементов в массиве

20.02.2017, 19:50. Показов 2377. Ответов 12


Студворк — интернет-сервис помощи студентам

как посчитать и вывести наибольшее число повторяющихся элементов в массиве?
То есть например {1233345677777} Соответственно нужно посчитать и число семерок. Например count 7 = 5.

подсчитать одинаковые элементы просто, но вот сделать так, что бы вывести число наибольших, а не всех тех, которые были повторены…не выходит



0



iHardc0re

5 / 5 / 4

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

Сообщений: 20

20.02.2017, 21:16

2

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

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdlib.h>
#include <stdio.h>
 
#define N 11
 
int main(void){
    int array[N]={12,6,78,6,7,8,7,6,7,3,7};
 
    int i,j, count, max_count=0, number;
 
    for(i=0;i<N;i++){
        count=0;
        for(j=0;j<N;j++){
            if(array[i] == array[j]){
                count++;
            }
        }
        if(count > max_count){
            max_count = count;
            number = array[i];
        }
    }
printf("Number %d Count %d",number,max_count);
  return 0;
}



2



LFC

737 / 542 / 416

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

Сообщений: 1,601

21.02.2017, 04:36

3

можно добавить проверку на неповторяемость

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdlib.h>
#include <stdio.h>
#define N 11
 
int main(){
    int array[N] = {7,6,78,6,7,8,7,6,7,3,7};
    int i, j, count = 0, max_count = 0, number, buff[N], k = 0, m, flag = 0;
    for(i = 0; i < N; i++, count = 0, flag = 0){
        if(!i)
            buff[k++] = array[i];
        else
            for(m = 0; m < k; m++)
                if(array[i] == buff[m]){
                    flag = 1;
                    break;
            }
        if(!flag){
            buff[k++] = array[i];
            for(j = 0; j < N; j++)
                if(array[i] == array[j])
                    count++;
        }
        if(count > max_count){
            max_count = count;
            number = array[i];
        }
    }
    printf("Number %d Count %d",number,max_count);
    return 0;
}

Добавлено через 1 час 19 минут
как вариант

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdlib.h>
#include <stdio.h>
 
int main(void){
    int array[] = {3,4,5,6,7,8,9,0,1,2,12,13,14,15,16,17,18,18,9,12,7,3,7};
    int i, j, count = 0, max_count = 0, number, k = 0, m, flag = 0, N, *buff;
    N = sizeof(array) / sizeof(array[0]);
    buff = malloc(N / 2 * sizeof*buff);
    if(!buff){
        fprintf(stderr, "Error memory allocate!");
        exit(1);
    }
    for(i = 0; i < N; i++, count = 0, flag = 0){
        if(!i)
            buff[k++] = array[i];
        else
            for(m = 0; m < k; m++)
                if(array[i] == buff[m]){
                    flag = 1;
                    break;
            }
        if(!flag){
            buff[k++] = array[i];
            for(j = 0; j < N; j++)
                if(array[i] == array[j])
                    count++;
        }
        if(count > max_count){
            max_count = count;
            number = array[i];
        }
        if(k == N/2){
            buff = realloc(buff, N * sizeof*buff);
            if(!buff){
                fprintf(stderr, "Error memory allocate!");
                exit(1);
            }
        }
    }
    printf("Number %d Count %d",number,max_count);
    free(buff);
    return 0;
}



2



Форумчанин

Эксперт CЭксперт С++

8194 / 5044 / 1437

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

Сообщений: 13,453

21.02.2017, 13:02

4

Цитата
Сообщение от MasterYoda
Посмотреть сообщение

То есть например {1233345677777} Соответственно нужно посчитать и число семерок.

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



1



Catstail

Модератор

Эксперт функциональных языков программированияЭксперт Python

35427 / 19452 / 4071

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

Сообщений: 32,488

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

22.02.2017, 17:13

5

Цитата
Сообщение от MrGluck
Посмотреть сообщение

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

— достаточно даже предположить, что все элементы массива просто меньше какого-либо не очень большого целого и неотрицательны. Тогда:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
 
#define NMAX 500
 
int main(int argc, char *argv[])
{
 
  int Arr[]={3,4,5,6,7,8,9,0,1,2,12,13,14,15,16,17,18,18,9,12,7,3,7};
  int Counter[NMAX];
  int i,j,n,max;
  
  for (i=0; i<NMAX; i++) Counter[i]=0;
  n=sizeof(Arr)/sizeof(int);
  
  for (i=0; i<n; i++) Counter[Arr[i]]++;
  
  max=Counter[0];
  for (i=1; i<n; i++) if (Counter[i] > max) {max=Counter[i]; j=i;}
  
  printf("max=%d i=%dn",max,j);
  
  system("PAUSE");  
  return 0;
}

Добавлено через 28 минут
Еще вариант (выдает максимальное число повторений):

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
 
int Count(int *A, int n)
{
    int *Arr,i;
    Arr=(int *) calloc(n, sizeof(int));
    for (i=0; i<n; i++) Arr[i]=A[i];
    return counter(Arr,n,0);
}    
 
int counter(int *Arr, int sz, int max)
{
    int *Tmp,i_f,i_t,i,a,c;
    
    Tmp=(int *) calloc(sz,sizeof(int));
    a=Arr[0];
    i_t=0;
    c=0;
    for (i_f=0; i_f<sz; i_f++)
       if (Arr[i_f]==a) 
          c++;          
       else
          Tmp[i_t++]=Arr[i_f];
    free(Arr);      
    if (i_t > 0)
    {
       if (c > max)
          return counter(Tmp,i_t,c);
       else
          return counter(Tmp,i_t,max);
    }                            
    else
    {
       free(Tmp);
       if (c > max)
          return c;
       else
          return max;
    }       
}          
    
int main(int argc, char *argv[])
{
  int Arr[]={3,4,5,6,7,8,9,0,1,2,12,13,14,15,16,17,18,18,18,18,9,12,7,3,7};  
  printf("%dn",Count(Arr,sizeof(Arr)/sizeof(int)));
  system("PAUSE");  
  return 0;
}



0



CoderHuligan

Нарушитель

1164 / 851 / 250

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

Сообщений: 4,431

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

22.02.2017, 19:03

6

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <string.h>
int main(void)
{
int Arr[]={3,4,5,6,7,8,9,0,1,2,12,13,14,15,16,17,18,18,18,18,9,12,7,3,7};
    int i, c=1, pc=1, n;
    n=sizeof(Arr)/sizeof(int);
    for(i=0; i<n; ++i)
    {
        if(Arr[i]==Arr[i+1])
            c++;
        else 
        {
            if(pc<c)pc=c; 
            c=1;
        }
    }
    printf("%d n",pc);
}



0



737 / 542 / 416

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

Сообщений: 1,601

22.02.2017, 19:14

7

CoderHuligan, если считать только идущие подряд,то да



0



Нарушитель

1164 / 851 / 250

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

Сообщений: 4,431

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

22.02.2017, 19:33

8

Цитата
Сообщение от LFC
Посмотреть сообщение

если считать только идущие подряд,то да

Немного не врубился в задание. Да и этот алгоритм немного неправильный.. кто найдёт ошибку ставлю лайк



1



LFC

737 / 542 / 416

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

Сообщений: 1,601

22.02.2017, 19:46

9

Цитата
Сообщение от CoderHuligan
Посмотреть сообщение

Немного не врубился в задание

посмотрев на ваш код я подумал что это я не врубился,ибо у ТС

Цитата
Сообщение от MasterYoda
Посмотреть сообщение

{1233345677777}

Цитата
Сообщение от CoderHuligan
Посмотреть сообщение

C
1
for(i=0; i<n; ++i)
C
1
for(i=0; i<n - 1; ++i

правда это не ошибка алгоритма

Цитата
Сообщение от CoderHuligan
Посмотреть сообщение

C
1
2
if(pc<c)pc=c; 
c=1;
C
1
2
3
4
if(pc<c){
    pc=c; 
    c=1;
}

скобки



1



CoderHuligan

Нарушитель

1164 / 851 / 250

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

Сообщений: 4,431

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

22.02.2017, 19:50

10

Цитата
Сообщение от LFC
Посмотреть сообщение

for(i=0; i<n — 1; ++i

Правильно. В конце будет проверятся элемент выходящий за границы массива.
вот правильный вариант:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <string.h>
int main(void)
{
int Arr[]={3,2,3,5,6,7,8,9,0,1,2,12,13,14,15,16,17,18,18,18,18,18,3};
    int i, c=1, pc=1, n;
    n=sizeof(Arr)/sizeof(int)-1;
    for(i=0; i<n; ++i)
    {
            if(Arr[i]==Arr[i+1])
            c++;
            else 
            {
                if(pc<c)pc=c; 
                c=1;
            }
    }
if(pc<c)pc=c;
    printf("%d n",pc);
}

Хотя это к задаче ТС и не относится…



0



MrGluck

Форумчанин

Эксперт CЭксперт С++

8194 / 5044 / 1437

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

Сообщений: 13,453

22.02.2017, 22:24

11

Catstail, да, вы уловили мою идею)
Единственное что, можно массив объявить так :

C
1
int Counter[NMAX] = {};

Все неинициализированные явно элементы (все в данном случае) будут созданы со значением 0.



1



Модератор

Эксперт функциональных языков программированияЭксперт Python

35427 / 19452 / 4071

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

Сообщений: 32,488

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

23.02.2017, 09:55

12

Цитата
Сообщение от MrGluck
Посмотреть сообщение

да, вы уловили мою идею

— идея классическая, известная



0



Форумчанин

Эксперт CЭксперт С++

8194 / 5044 / 1437

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

Сообщений: 13,453

23.02.2017, 20:31

13

Я на авторство и не претендую, просто хотел подметить, что одинаково думаем)

И это хорошо.



1



Спасибо, на этом примере работает. А как применить это решение к немного другому виду массива чет не могу понять?

const massive = [
  'Max download report 1',
  'Felix download report 4',
  'Roberto upload report 5',
  'Alex download report 1',
  'Stef download report 2',
  'Sam download report 3',
  'Monika upload report 54'
]

нужно посчитать максимальное количество повторений подряд строки с словом download

Нужно найти в массиве максимальное кол-во повторяющихся подряд элементов и вывести какой элемент повторяется и его первый индекс.

Например дан такой массив (в массиве могут быть не только строки но и цифры):

const arr = ['re','tres','tred','test','test','test','yt','ttt','ttt','test','test'];

Где, строка ‘test’ повторяется подряд 3 раза. Вывод в консоль должен быть примерно такой объект:

object = {name = 'test',count: 3, index: 3}

Моя попытка:

const arr = ['re','tres','tred','test','test','test','yt','ttt','ttt','test','test'];
let s = [];
let count = 0;
arr.forEach((item,index,array) => {
  if(item == array[index +1]) {
    s.push({item,index,count});
    count++;
  }
})

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

Поиск наиболее повторяющегося значения в Excel

Чтобы наглядно продемонстрировать работу формулы для примера воспользуемся такой схематической таблицей регистра заказов от клиентов:

Регистр заказов.

Теперь выполним простой анализ наиболее часто и редко повторяющихся значений таблицы в столбце «Город». Для этого:

  1. Сначала находим наиболее часто повторяющиеся названия городов. В ячейку E2 введите следующую формулу:
  2. Обязательно после ввода формулы нажмите комбинацию горячих клавиш CTRL+SHIFT+Enter, так как ее нужно выполнить в массиве.
  3. Для вычисления наиболее редко повторяющегося названия города вводим весьма похожую формулу:

Результат поиска названий самых популярных и самых редких городов клиентов в регистре заказов, отображен на рисунке:

Наибольшее и наименьшее повторения.

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



Принцип действия поиска популярных по повторению значений:

Если посмотреть на синтаксис формул то можно легко заметить, что они отличаются только одним из названием функций: =МАКС() и =МИН(). Все остальные аргументы формулы – идентичны. Функция =СЧЕТЕСЛИ() подсчитывает, сколько раз каждое название города повторяется в диапазоне ячеек C2:C16. Таким образом в памяти создается условный массив значений.

Скачать пример поиска наибольшего и наименьшего повторения значения

Функция МАКС или МИН выбирает из условного массива наибольшее или наименьшее значение. Функция =ПОИСКПОЗ() возвращает номер позиции на которой в столбце C название города соответственного наибольшему или наименьшему количеству повторений. Полученное значение будет передано в качестве аргумента для функции =ИНДЕКС(), которая возвращает конечный результат в ячейку.

Понравилась статья? Поделить с друзьями:
  • Как найти точно такие же обои
  • Как найти площадь основание высоту параллелограмма
  • Как найти массу со2 при н у
  • Как найти айфон который отключен
  • Как найти шпиона смотреть