less than 1 minute read

1. enumerate(start=0)

注意这个 optinal 的 start 参数,表示 enumerate yield 出来的 index 的起始值,比如:

In [1]: list(enumerate(["foo", "bar", "baz"], start=100))
Out[1]: [(100, 'foo'), (101, 'bar'), (102, 'baz')]                                           

这一点在你 enumerate slice 的时候很好用。一个常见的错误:比如你要 enumerate(array[i:]),你可能会默认了 yield 出的 index 会从 i 开始,但其实并不会。为了实现你这个目的,可以用 enumerate(array[i:], start=i),比如:

In [3]: array = [None, 100, 200, 300]

In [7]: list(enumerate(array[1:]))
Out[7]: [(0, 100), (1, 200), (2, 300)]  # 这个 indexing 可能不是你想要的效果

In [5]: list(enumerate(array[1:], start=1)
Out[5]: [(1, 100), (2, 200), (3, 300)]

2. enumeratereversed

就是要注意下 $f_{enum} \circ f_{rev}$ 与 $f_{rev} \circ f_{enum}$ 的区别:

In [12]: list(enumerate(reversed(['a', 'b', 'c']))) 
Out[12]: [(0, 'c'), (1, 'b'), (2, 'a')]

In [14]: list(reversed(enumerate(['a', 'b', 'c']))) 
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-14-c6f1fa656095> in <module>
----> 1 list(reversed(enumerate(['a', 'b', 'c'])))

TypeError: 'enumerate' object is not reversible

In [15]: list(reversed(list(enumerate(['a', 'b', 'c']))))
Out[15]: [(2, 'c'), (1, 'b'), (0, 'a')]

Categories:

Updated:

Comments