1

在 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

姓名:乙:

Type Count
A    3
B    2
C    3
Total 8

我知道我需要创建一个循环first statement = the first statement并执行以下操作,但不知道如何处理/编码。

4

2 回答 2

2

这是一个稍微慢一点的算法,可以完成它:

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

最终,我认为你所追求的是尝试

于 2012-10-15T23:53:46.890 回答
0

说您的字典对给定键有多个值有点误导。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)
于 2012-10-16T00:02:38.340 回答