В Python у меня в настоящее время есть словарь с составным ключом. В этом словаре есть несколько вхождений этих ключей. (Клавиши разделяются запятой):
(A,B), (A,C), (A,B), (A,D), (C,A), (A,B), (C,A), (C,B), (C,B)
У меня уже есть что-то, что составляет уникальные вхождения и подсчитывает дубликаты, которые дают мне распечатку, подобную этой:
(A,B)
со счетом 4
, (A,C)
со счетом 2
, (B,C)
со счетом 6
и т.д.
Я хотел бы знать, как закодировать цикл, который дал бы мне следующее:
Распечатайте первое заполнение первой части ключа и его связанных значений и подсчетов.
Имя: A:
Type Count
B 4
C 2
Total 6
Имя: B:
Type Count
A 3
B 2
C 3
Total 8
Я знаю, что мне нужно создать цикл, в котором first statement = the first statement
и сделать следующее, но не имеют реальной идеи, как подходить/кодировать это.
Вот немного медленный алгоритм, который сделает это:
def convert(myDict):
keys = myDict.keys()
answer = collections.defaultdict(dict)
for key in keys:
for k in [k for k in keys if k.startswith(key[0])]:
answer[key[0]][k[1]] = myDict[k]
return answer
В конце концов, я думаю, что вы после этого является Trie
Немного неверно сказать, что ваш словарь имеет несколько значений для заданного ключа. Python этого не допускает. Вместо этого у вас есть ключи, которые являются кортежами. Вы хотите распаковать эти кортежи и перестроить вложенный словарь.
Вот как я это сделаю:
import collections
# rebuild data structure
nested = collections.defaultdict(dict)
for k, v in myDict.items():
k1, k2 = k # unpack key tuple
nested[k1][k2] = v
# print out data in the desired format (with totals)
for k1, inner in nested.items():
print("%s\tType\tCount" % k1)
total = 0
for k2, v in innner.items():
print("\t%s\t%d" % (k2, v))
total += v
print("\tTotal\t%d" % total)
(A,B)
например)?