字典中的频率计数-使用理解的Python

时间:2018-11-11 11:54:03

标签: python

我有一本字典,想用Python理解计数频率。

示例:

输入

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.2.RELEASE</version>
</parent>
...
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <scope>test</scope>
    </dependency>
...

输出

{0: 'Succeeded', 1: 'Succeeded', 2: 'Failed', 3: 'Failed', 4: 'Succeeded'}

1 个答案:

答案 0 :(得分:4)

只需使用Counter到字典的values即可,而不是理解。

>>> from collections import Counter
>>> d = {0: 'Succeeded', 1: 'Succeeded', 2: 'Failed', 3: 'Failed', 4: 'Succeeded'}
>>> Counter(d.values())
>>> Counter({'Failed': 2, 'Succeeded': 3})

常规提示

具有连续整数键的字典会浪费内存。您可以使用列表

my_list = ['Succeeded', 'Succeeded', 'Failed', 'Failed', 'Succeeded']

可以像使用原始词典一样在其中使用整数0, 1, 2, ...进行索引。该列表占用的内存更少,并且无需哈希键即可找到值。

在这种情况下,Counter(my_list)将构建您想要的字典。


下面的警告错误代码

可以,但 应该写一个如下的理解

>>> vals = list(d.values())
>>> {v:vals.count(v) for v in vals}
>>> {'Failed': 2, 'Succeeded': 3}

但是我强烈建议您不要使用这种理解,因为与O(n)Counter解决方案相反,它具有二次时间复杂度。对于vals中的每个值,都会对vals进行迭代以计算该值。