1

我正在回答这个问题,我的解决方案如下(我没有发布这个答案):

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 解释器的这种行为

4

1 回答 1

4

这看起来不对:

for char in w:
    if w not in digits:
      ^^^

也许:

for char in w:
    if char not in digits: 
       ^^^^
于 2012-11-21T18:09:20.770 回答