Вычисление элемента с наибольшим количеством вхождений в список

#python #dictionary

#python #словарь

Вопрос:

У меня есть

 dict = {
    0: ['9', '3', '3', '5', '1'],
    1: ['9', '4', '1', '2'],
    2: ['3', '4', '1', '5', '5'],
    3: ['4', '4', '5', '5', '1'],
    4: ['2', '8', '9', '5', '1']
}
  

возьмем пример, в котором здесь больше случаев, поэтому мне нужно обновить список ввода только с 3, поэтому при индексе 0 становится [3] 0:['9', '3', '3', '5', '1'] 3

если каждый элемент имеет одинаковый вес 1: ['9', '4', '1', '2'] , изменений не будет

другой ['4', '4', '5', '5', '1'] возвращает ['4','5']

я пытался использовать collection.counter , но не знаю, как обновить исходный dict с максимальным повторением

 for i,j in dictonary.items():
    dictonary[i]=Counter(j)
  

ожидаемый результат:

 {0: ['3'], 1: ['9', '4', '1', '2'], 2: ['5'], 3: ['4'], 4: ['2', '8', '9', '5', '1']}
  

Редактировать: размер списка может отличаться

 [1,1,1,1,1,2,2,2,2,2,3,3,3]->[1,2]
[3,3,3,3,4,4,4,4,4,5,6,6,6,6,6]->[4,6]
  

Комментарии:

1. Я не совсем понимаю, что вы имеете в виду. Вы хотите найти пару ключ-значение по количеству повторений? Итак 0 , макс здесь? Почему 3 не является кандидатом? Он имеет два '5' значения в списке.

2. Вы просите найти режим ? Это отличается от «max».

3. @MartijnPieters с индексом 0. 3 повторялось много раз, поэтому я хочу обновить элемент индекса 0 значением 3. извините за мой английский

4. Что произойдет, если у вас есть что-то вроде ['4', '4', '5', '5', '1'] ?

5. @Holt [‘4′,’5’] он вернет

Ответ №1:

 from collections import *

d ={0: ['9', '3', '3', '5', '1'], 1: ['9', '4', '1', '2'], 2: ['3', '4', '1', '5', '5'], 3: ['4', '5', '0', '4', '3'], 4: ['2', '8', '9', '5', '1']}

for i,j in d.items():
    c  = Counter(j)
    top = c.most_common(1)
    if top[0][1] > 1:
        d[i] = [ top[0][0] ]

print d

{0: ['3'], 1: ['9', '4', '1', '2'], 2: ['5'], 3: ['4'], 4: ['2', '8', '9', '5', '1']}
  

Редактировать:

 from collections import *

d = {
 0: ['4', '4', '5', '5', '1'], 
 1: ['9', '4', '1', '2'], 
 2: ['3', '4', '1', '5', '5'] 
}

for i,j in d.items():

    c  = Counter(j)

    result = []

    for x in c:
        if c[x] > 1:
            result.append(x)

    if result:       
        d[i] = result

print d

{0: ['5', '4'], 1: ['9', '4', '1', '2'], 2: ['5']}
  

Редактировать:

 from collections import *

d = {
 0: ['4', '4', '5', '5', '1'], 
 1: [1,1,1,1,1,2,2,2,2,2,3,3,4], 
 2: ['3', '4', '1', '5', '5']
}

for i,j in d.items():

    c  = Counter(j)

    longest = c.most_common(1)[0][1]

    if longest > 1:

        result = []

        for x in c:

            if c[x] == longest:
                result.append(x)

        d[i] = result

print d

{0: ['5', '4'], 1: [1, 2], 2: ['5']}
  

Комментарии:

1. [‘4’, ‘4’, ‘5’, ‘5’, ‘1’] что с этим делать?

2. еще одна вещь, диапазон моего списка не является фиксированным. в качестве примера я привел список длиной 5, на самом деле у меня есть список, который может варьироваться до любой длины. как я могу проверить, что пример [1,1,1,1,1,2,2,2,2,2,3,3,4] должен возвращать [1,2]

3. согласно приведенному выше комментарию, он возвращает 1,2,3, но он должен быть 1,2

4. почему max(c.values()) не работает. есть ли какое-либо объяснение этому repl.it/UCj модифицированный ур . это работает нормально

5. max(c.values()) — какого результата вы ожидаете? max(c.values()) дайте то же значение, c.most_common(1)[0][1] что и для меня max(c.values()) , работает правильно.

Ответ №2:

Похоже, вы ищете режим каждого элемента в своем словаре.

 from collections import Counter

def mode(L):
  result = []
  for x in L:
    if Counter(L)[x] == max(Counter(L).values()):
      if x not in result: result.append(x)
  return result

for item in dict:
  dict[item] = mode(dict[item])