【问题标题】:Python: While Statement = Statement Print associated ValuesPython:while 语句 = 语句打印关联值
【发布时间】:2012-10-15 23:48:44
【问题描述】:

在 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 的位置创建一个循环并执行以下操作,但不知道如何处理/编码。

【问题讨论】:

  • 你怎么能有一个字典多次使用相同的键(例如(A,B))?
  • 它来自一个列表列表,该列表基本上来自一个巨大的文本文件。我必须在哪里寻找某些值并找到与它们相关的值。对于字典的多次出现,我基本上将发现的每个出现的值 V 增加 1。如果它没有找到该值,它将创建一个新值并将其设置为 1。抱歉,我不清楚。意思是说我基本上增加了原始列表中每个重复项的值。 Dictionary 是所有唯一条目,但每个条目的 Value V 表示在原始列表中找到的次数。
  • @Alok:我认为 OP 的意思是他有一个带有(A,B) 的集合,等等。然后,他使用collections.Counter 将所述集合处理成一个字典,大概
  • 嗯,(A,B) 样式的键是字符串还是元组?如果它们真的是字符串,我的回答可能不正确(尽管修改解包以获取正确的子字符串很容易)。
  • @Blackknght 我认为它们最初是字符串。我最初通过一个文件来查找与模式匹配的东西。然后,我从与我正在搜索的内容匹配的每一行中提取两个值(键中的值)。它基本上是一个包含 IP 源地址和目标地址以及使用的相关协议的文件。

标签: python loops dictionary unique


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    说您的字典对给定键有多个值,这有点误导。 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)
    

    【讨论】: