#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])