Equivalents of Ruby's "!" methods?
Steven D'Aprano
steve at REMOVE-THIS-cybersource.com.au
Mon Aug 25 19:47:16 EDT 2008
On Mon, 25 Aug 2008 17:04:07 +0000, Grzegorz Staniak wrote:
> On 25.08.2008, Terry Reedy <tjreedy at udel.edu> wroted:
>
>> The newish sorted() and reversed() built-ins were meant to complement
>> list.sort and list.reverse, not replace them.
>
> BTW, is there a reason why sorted() on a list returns a list, while
> reversed() on the same list returns an iterator?
Until the day that somebody discovers how to sort a list without seeing
all the items first, there's no point in sorted() returning an iterator.
It has to generate a copy of the entire list to sort it, and so might as
well just return the list -- there's no advantage to turning it into an
iterator after you've already built the list.
On the other hand, reversed() can supply it's items lazily. Although it
does need access to the entire source, it doesn't need to return an
entire list. It can just return the items one at a time, starting from
the last one.
That however does mean there's one gotcha: if you mutate a list after
calling sorted() on it, the result of the sorted() doesn't change. But
the same doesn't hold for reversed():
>>> L = range(5)
>>> it = reversed(L) # expecting [4, 3, 2, 1, 0] as an iterator
>>> it.next()
4
>>> L[3] = 'mutate'
>>> it.next()
'mutate'
The solution to that is simple: call list(reversed(L)). Or don't mutate
the original.
--
Steven
More information about the Python-list
mailing list