我正在回答这个问题,我的解决方案如下(我没有发布这个答案):
def wordigit(w):
digits = {}
c = itertools.count(1)
for char in w:
if w not in digits:
digits[char] = c.next()
return ''.join(str(i) for i in (digits[char] for char in w))
print ' '.join(wordigit(w) for w in s.split())
乍一看,这看起来是对的。但是我得到了一个错误的结果:
In [236]: ' '.join(wordigit(w) for w in s.split())
Out[236]: '12345 14345 33345' # notice the numbers in the second "word". 1-4 is not a legal progression for itertools.count. It should have been 12324 instead of 14345
我在 IPython 中开发了这个解决方案。考虑到这可能是 IPython 在后台进行了一些优化的错误,我启动了一个 python 解释器来查看它的内容。我还认为列表理解可能会导致一些异常行为。所以我尝试调用wordigit
两次 - 在两个不相等的字符串中的每一个上调用一次,并得到以下结果:
>>> def wordigit(w):
... digits = {}
... c = itertools.count(1)
... for char in w:
... if w not in digits:
... digits[char] = c.next()
... return ''.join(str(i) for i in (digits[char] for char in w))
...
>>> wordigit('areyo')
'12345'
>>> wordigit('uanap')
'14345'
所以看起来即使我itertools.count
在函数中创建了对象(因此函数应该在每次运行时重新创建它),它在函数返回后仍然存在,并且在再次调用函数时无需重新初始化即可重用。同样,很明显,dict
“数字”wordigit
也是如此。
这是怎么回事?不知何故,这种行为对我来说没有意义。
我注意到 Ipython 中的 Python 2.7.1 和新的 Python 2.7.3 解释器的这种行为