Подсчет отдельных значений словаря - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть dictionary (key,list)

index={'chair':['one','two','two','two'],'table':['two','three','three']}

, и я хочу это

#1. number of times each value occurs in each key. ordered descending
indexCalc={'chair':{'two':3,'one':1}, 'table':{'three':2,'two':1}}
#2. value for maximum amount for each key
indexMax={'chair':3,'table':2}
#3. we divide each value in #1 by value in #2 
indexCalcMax={'chair':{'two':3/3,'one':1/3}, 'table':{'three':2/2,'two':1/2}}

Я думаю, что я должен использовать лямбда-выражения, но не могу придумать, как ямогу сделать это.Любая помощь?

Ответы [ 4 ]

0 голосов
/ 23 сентября 2018

Я знаю, что это неоптимально, но я должен был сделать это как упражнение на мысль:

indexCalc = {
    k: {key: len([el for el in index[k] if el == key]) for key in set(index[k])} 
    for k in index
}

Не совсем лямбда, как предложено, но понимание ... Не используйте этот код в производстве:) Этот ответ является лишь частичным, вы можете использовать аналогию и придумать две другие необходимые вам структуры.

0 голосов
/ 23 сентября 2018

Во-первых, определите ваши значения в виде списков правильно:

index = {'chair': ['one','two','two','two'], 'table': ['two','three','three']}

Затем используйте collections.Counter со словарными значениями:

from collections import Counter
  1. количество раз каждое значениевстречается в каждом ключе.
res1 = {k: Counter(v) for k, v in index.items()}
значение для максимальной суммы для каждого ключа
res2 = {k: v.most_common()[0][1] for k, v in res1.items()}
мы делим каждое значение в # 1 на значение в # 2
res3 = {k: {m: n / res2[k] for m, n in v.items()} for k, v in res1.items()}
0 голосов
/ 23 сентября 2018

Во-первых, у вас есть ошибка в том, как вы создали диктат index.У вас должны быть списки в качестве элементов для каждого словаря, у вас есть наборы.Наборы автоматически дедуплицируются, поэтому вы не сможете получить правильный счет отсюда.

Вы должны исправить индекс так:

index={'chair':['one','two','two','two'],'table':['two','three','three']}

Вы можете использовать Модуль счетчика в Python 3, который является подклассом модуля dict, для генерации того, что вы хотите для каждой записи в indexCalc.Счетчик создаст словарь с ключом, и количество раз, когда этот ключ существует в коллекции.

indexCalc = {k, Counter(v) for k, v in index}

indexCalc выглядит так:

{'chair': Counter({'two': 3, 'one': 1}), 'table': Counter({'three': 2, 'two': 1})}

Мы можем легконайдите индекс, соответствующий максимальному значению в каждом под-словаре:

indexMax = {k: max(indexCalc[k].values()) for k in indexCalc}

indexMax выглядит так:

{'chair': 3, 'table': 2}

Вы можете создать indexCalcMax со следующим пониманием, что немного уродливо:

indexCalcMax = {k: {val: indexCalc[k][val] / indexMax[k] for val in indexCalc[k]} for k in indexCalc}

, что является переводом словосочетания этого цикла:

for k in indexCalc:
  tmp = {}
  for val in indexCalc[k]:
    tmp[val] = indexCalc[k][val] / float(indexMax[k])
  indexCalcMax[k] = tmp
0 голосов
/ 23 сентября 2018
index={'chair':{'one','two','two','two'},'table':{'two','three','three'}}

Проблема: {} создает набор.Поэтому вам следует подумать о том, чтобы преобразовать его в список.

Теперь перейдем к вашему решению:

from collections  import Counter


index={'chair': ['one','two','two','two'],'table':['two','three','three']}
updated_index = {'chair': dict(Counter(index['chair'])), 'table': dict(Counter(index['table']))}
updated_index_2 = {'chair': Counter(index['chair']).most_common()[0][1], 'table': Counter(index['table']).most_common()[0][1]}
print(updated_index)
print(updated_index_2)

Вы можете использовать библиотеку коллекций Python, Counter, чтобы найти счетчик без написания лямбда-функции..

{'стул': {'один': 1, 'два': 3}, 'таблица': {'два': 1, 'три': 2}}

{'стул': 3, 'стол': 2}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...