在 Python 中计算字典中不同键的数量

Posted

技术标签:

【中文标题】在 Python 中计算字典中不同键的数量【英文标题】:Counting the number of distinct keys in a dictionary in Python 【发布时间】:2011-01-13 19:43:36 【问题描述】:

我有一个字典,将关键字映射到关键字的重复,但我只想要一个不同单词的列表,所以我想计算关键字的数量。有没有办法计算关键字的数量,还是有另一种方法我应该寻找不同的词?

【问题讨论】:

Python 字典中的键已经彼此不同。在 Python 字典中,您不能将确切的 some 关键字作为键两次。因此,计算键的数量与计算不同的键的数量相同。 【参考方案1】:
len(yourdict.keys())

或者只是

len(yourdict)

如果您想计算文件中的唯一单词,您可以使用 set 并点赞

len(set(open(yourdictfile).read().split()))

【讨论】:

我知道这篇文章很旧,但我很好奇。这是最快的方法吗?或者:对于大型词典来说,它是一种相当快的方法吗? len(yourdict.keys())len(yourdict) 都是 O(1)。后者稍快一些。请参阅下面的测试。 我想指出,您也可以使用 len(yourdict.values()) 获取值(我知道问题没有问它)【参考方案2】:

可以使用len() 函数找到不同单词的数量(即字典中的条目数)。

> a = 'foo':42, 'bar':69
> len(a)
2

要获取所有不同的单词(即键),请使用 .keys() 方法。

> list(a.keys())
['foo', 'bar']

【讨论】:

【参考方案3】:

直接在您的字典上调用len() 是可行的,并且比构建迭代器d.keys() 并在其上调用len() 更快,但是与您的程序正在执行的其他任何操作相比,两者的速度都可以忽略不计。

d = x: x**2 for x in range(1000)

len(d)
# 1000

len(d.keys())
# 1000

%timeit len(d)
# 41.9 ns ± 0.244 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%timeit len(d.keys())
# 83.3 ns ± 0.41 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

【讨论】:

【参考方案4】:

如果问题是关于计算关键字的数量,那么会推荐类似

def countoccurrences(store, value):
    try:
        store[value] = store[value] + 1
    except KeyError as e:
        store[value] = 1
    return

在主函数中有一些东西可以遍历数据并将值传递给 countoccurrences 函数

if __name__ == "__main__":
    store = 
    list = ('a', 'a', 'b', 'c', 'c')
    for data in list:
        countoccurrences(store, data)
    for k, v in store.iteritems():
        print "Key " + k + " has occurred "  + str(v) + " times"

代码输出

Key a has occurred 2 times
Key c has occurred 2 times
Key b has occurred 1 times

【讨论】:

PEP 8 naming conventions 规定 countoccurrences() 应改为 count_occurrences()。另外,如果你导入collections.Counter,还有一个更好的方法:from collections import Counter; store = Counter(); for data in list: store[list] += 1【参考方案5】:

对发布的答案 UnderWaterKremlin 进行了一些修改,以使其成为 python3 证明。下面是一个令人惊讶的结果作为答案。

系统规格:

python =3.7.4, conda = 4.8.0 3.6Ghz,8 核,16GB。
import timeit

d = x: x**2 for x in range(1000)
#print (d)
print (len(d))
# 1000

print (len(d.keys()))
# 1000

print (timeit.timeit('len(x: x**2 for x in range(1000))', number=100000))        # 1

print (timeit.timeit('len(x: x**2 for x in range(1000).keys())', number=100000)) # 2

结果:

1) = 37.0100378

2) = 37.002148899999995

所以看起来len(d.keys()) 目前比只使用len() 更快。

【讨论】:

【参考方案6】:

为了统计字典中的关键字个数:

def dict_finder(dict_finders):
    x=input("Enter the thing you want to find: ")
    if x in dict_finders:
        print("Element found")
    else:
        print("Nothing found:")

【讨论】:

以上是关于在 Python 中计算字典中不同键的数量的主要内容,如果未能解决你的问题,请参考以下文章

Python3 字典键的数据类型不同报错

kafka主题分区的数量和数据中不同键的数量

mongodb count 每个字段/键的不同值的数量

如何使用 Swift 将具有两个不同键的两个值存储到数组或字典中? [关闭]

计算数组中不同元素数量的最快方法

如果 Hive 的 reducer 数量与键的数量不同,会发生啥?