我有一本字典,想用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'}
答案 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
进行迭代以计算该值。