gpt4 book ai didi

python - 返回键的字典值,如果字典不包含该键,则返回键

转载 作者:太空宇宙 更新时间:2023-11-04 01:40:29 27 4
gpt4 key购买 nike

背景:自从我阅读 https://stackoverflow.com/questions/228181/the-zen-of-python 以来已经有一段时间了。所以我去了解释器并输入了 import this,出于好奇,我检查了新导入的 this 模块的内容并看到了 this有一些有趣的属性,最值得注意的是:

>>> this.s
"Gur Mra bs Clguba, ol Gvz Crgref\n\nOrnhgvshy vf orggre guna htyl.\nRkcyvpvg vf orggre guna vzcyvpvg.\nFvzcyr vf orggre guna pbzcyrk.\nPbzcyrk vf orggre guna pbzcyvpngrq.\nSyng vf orggre guna arfgrq.\nFcnefr vf orggre guna qrafr.\nErnqnovyvgl pbhagf.\nFcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf.\nNygubhtu cenpgvpnyvgl orngf chevgl.\nReebef fubhyq arire cnff fvyragyl.\nHayrff rkcyvpvgyl fvyraprq.\nVa gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.\nGurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg.\nNygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu.\nAbj vf orggre guna arire.\nNygubhtu arire vf bsgra orggre guna *evtug* abj.\nVs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.\nVs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.\nAnzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!"
>>> this.d
{'A': 'N', 'C': 'P', 'B': 'O', 'E': 'R', 'D': 'Q', 'G': 'T', 'F': 'S', 'I': 'V', 'H': 'U', 'K': 'X', 'J': 'W', 'M': 'Z', 'L': 'Y', 'O': 'B', 'N': 'A', 'Q': 'D', 'P': 'C', 'S': 'F', 'R': 'E', 'U': 'H', 'T': 'G', 'W': 'J', 'V': 'I', 'Y': 'L', 'X': 'K', 'Z': 'M', 'a': 'n', 'c': 'p', 'b': 'o', 'e': 'r', 'd': 'q', 'g': 't', 'f': 's', 'i': 'v', 'h': 'u', 'k': 'x', 'j': 'w', 'm': 'z', 'l': 'y', 'o': 'b', 'n': 'a', 'q': 'd', 'p': 'c', 's': 'f', 'r': 'e', 'u': 'h', 't': 'g', 'w': 'j', 'v': 'i', 'y': 'l', 'x': 'k', 'z': 'm'}

我认为 Zen 可以通过使用 this.d 中的字符映射从 this.s 中获得,所以我想出了下面这行实际上打印 Python 之禅:

"".join(this.d[c] if c in this.d else c for c in this.s)

然后我回到上面链接的 Stack Overflow wiki,想我会发布这个有趣的信息,但当然它已经在那里,并且已经存在了 2 年半。然而,该帖子使用以下方法获取禅宗:

"".join(c in this.d and this.d[c] or c for c in this.s)

这节省了几个字符,但发生的事情不太明显(在我看来)。所以我想我会检查一下 this.py 使用的是哪种方法,当然它是比上述任何一个更优雅的解决方案:

"".join(this.d.get(c, c) for c in this.s)

问题:这个过程让我开始思考,这三种方法之间是否存在性能差异,使它们明显更好?

显然最后一种方法很棒,因为它的可读性更高,但我听说有一些与 Python 函数调用相关的开销,所以得知其他方法之一更快我不会感到惊讶。

那么,如果这些方法中有任何一种比其他方法更有效,那是哪种方法,为什么?

最佳答案

唯一的方法就是尝试:)

这是我的设置:

>>> import timeit
>>> cmd1 = """\
... "".join(this.d[c] if c in this.d else c for c in this.s)
... """
>>> cmd2 = """\
... "".join(c in this.d and this.d[c] or c for c in this.s)
... """
>>> cmd3 = """\
... "".join(this.d.get(c, c) for c in this.s)
... """
>>> cmd4 = """\
... _get=this.d.get;"".join(_get(c, c) for c in this.s)
... """
>>> t1 = timeit.Timer(cmd1, "import this")
>>> t2 = timeit.Timer(cmd2, "import this")
>>> t3 = timeit.Timer(cmd3, "import this")
>>> t4 = timeit.Timer(cmd4, "import this")

结果:

print "%.2f usec/pass" % (1000000 * t1.timeit(number=100000)/100000)
362.67 usec/pass

>>> print "%.2f usec/pass" % (1000000 * t2.timeit(number=100000)/100000)
364.25 usec/pass

>>> print "%.2f usec/pass" % (1000000 * t3.timeit(number=100000)/100000)
391.97 usec/pass

>>> print "%.2f usec/pass" % (1000000 * t4.timeit(number=100000)/100000)
246.91 usec/pass

关于python - 返回键的字典值,如果字典不包含该键,则返回键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5505822/

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