-6ren">
gpt4 book ai didi

Python字典,寻找特定的方法

转载 作者:太空宇宙 更新时间:2023-11-04 09:43:50 25 4
gpt4 key购买 nike

假设我有一个字典,其中的字符串作为键,值作为整数。在哪里键将是遇到的不同字符串以及遇到的次数。

例如:"word word word" 会产生:{"word": 3}

我想对变量说:

item -> our dictionary
string -> word encountered

if string in item:
# increase existing keys' value by 1
item.update({string, item.get(string) + 1})

else:
# create the key and initialize value to 1
item.update({string : 1})

这个算法很慢,因为通过调用 updatestring in item 方法进行两次散列,如果 python 执行散列以检查 string 是否存在,会更快如果键存在,项目要么将值增加 1,要么创建键并将值设置为 1。

在 Java 中相应的方法是:

item.merge(string, 1, Integer::sum)

if-else 语句中的代码减少到只有一行,并再次跳过散列。只是想知道 python 3 中是否存在这种方法。

提前致谢!

最佳答案

我使用不同的方式来填充字典,做了一些时序分析。首先,设置:

import collections, re    
lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
words = re.findall("\w+", lorem.lower())

现在,函数,使用你的方法和 update,或者只使用 +=,或者 get默认情况下,以及 defaultdictCounter :

def f1():
d = {}
for w in words:
if w in d:
d.update({w: d[w] + 1})
else:
d.update({w: 1})
return d

def f2():
d = {}
for w in words:
if w in d:
d[w] += 1
else:
d[w] = 1
return d

def f3():
d = {}
for w in words:
d[w] = d.get(w, 0) + 1
return d

def f4():
d = collections.defaultdict(int)
for w in words:
d[w] += 1
return d

def f5():
return collections.Counter(words)

它们都产生相同的结果,尽管最后两个使用 dict 的子类:

In [41]: f1() == f2() == f3() == f4() == f5()
Out[41]: True

在这里使用 update 非常浪费; += 是最快的,即使有 in 检查,而 defaultdictCounter 更短,但也更慢。

In [42]: %timeit f1()
10000 loops, best of 3: 81.8 us per loop

In [43]: %timeit f2()
10000 loops, best of 3: 24.8 us per loop

In [44]: %timeit f3()
10000 loops, best of 3: 40.8 us per loop

In [45]: %timeit f4()
10000 loops, best of 3: 52.6 us per loop

In [46]: %timeit f5()
10000 loops, best of 3: 104 us per loop

但是请注意,在此示例文本中,大多数单词只出现一次,这可能会使测试出现偏差。使用 words = words * 100,我们得到了这个,使 Counter 不那么慢,而 defaultdict 最快。

In [2]: %timeit f1()
100 loops, best of 3: 8.21 ms per loop

In [3]: %timeit f2()
100 loops, best of 3: 2.76 ms per loop

In [4]: %timeit f3()
100 loops, best of 3: 3.58 ms per loop

In [5]: %timeit f4()
100 loops, best of 3: 2.13 ms per loop

In [6]: %timeit f5()
100 loops, best of 3: 6.11 ms per loop

不过,我个人还是会使用 Counter,因为运行时间的差异可能不是什么大问题,它是最短的,意图很明确,而且它还提供了一些有用的辅助方法,比如获取最常见的条目等。

关于Python字典,寻找特定的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50553442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com