|  | Sorted Returns List and Reversed Returns Iterator |  | |
| | | ++imanshu |  |
| Posted: Fri Aug 22, 2008 2:12 am Post subject: Sorted Returns List and Reversed Returns Iterator |  |
Hi,
Is there a reason why two similarly named functions Sorted and Reversed return different types of data or is it an accident.
Thanks, ++imanshu |
| |
| | | John Machin |  |
| Posted: Fri Aug 22, 2008 3:35 am Post subject: Re: Sorted Returns List and Reversed Returns Iterator |  |
On Aug 22, 12:12 pm, "++imanshu" <himanshu.g...@gmail.com> wrote:
| Quote: | Hi,
Is there a reason why two similarly named functions Sorted and Reversed return different types of data or is it an accident.
|
You seem to have an interesting notion of "similarly named". name0[-2:] == name1[-2:], perhaps? The two functions (eventually, in the case of "reversed") return data in the order one would expect from their names.
| Quote: | x = [1, 3, 5, 2, 4, 6] sorted(x) [1, 2, 3, 4, 5, 6] reversed(x) listreverseiterator object at 0x00AA5550 list(reversed(x)) [6, 4, 2, 5, 3, 1]
|
|
| |
| | | John Machin |  |
| Posted: Fri Aug 22, 2008 3:40 am Post subject: Re: Sorted Returns List and Reversed Returns Iterator |  |
On Aug 22, 1:35 pm, John Machin <sjmac...@lexicon.net> wrote:
| Quote: | On Aug 22, 12:12 pm, "++imanshu" <himanshu.g...@gmail.com> wrote:
Hi,
Is there a reason why two similarly named functions Sorted and Reversed return different types of data or is it an accident.
You seem to have an interesting notion of "similarly named". name0[-2:] == name1[-2:], perhaps? The two functions (eventually, in the case of "reversed") return data in the order one would expect from their names.
x = [1, 3, 5, 2, 4, 6] sorted(x) [1, 2, 3, 4, 5, 6] reversed(x)
listreverseiterator object at 0x00AA5550
list(reversed(x)) [6, 4, 2, 5, 3, 1]-
|
Sorry; having re-read the message subject:
reversed came later; returning an iterator rather than a list provides more flexibility.
Cheers, John |
| |
| | | Peter Otten |  |
| Posted: Fri Aug 22, 2008 4:28 am Post subject: Re: Sorted Returns List and Reversed Returns Iterator |  |
| |  | |
++imanshu wrote:
| Quote: | On Aug 22, 8:40Â am, John Machin <sjmac...@lexicon.net> wrote: On Aug 22, 1:35Â pm, John Machin <sjmac...@lexicon.net> wrote:
On Aug 22, 12:12Â pm, "++imanshu" <himanshu.g...@gmail.com> wrote:
Hi,
Is there a reason why two similarly named functions Sorted and Reversed return different types of data or is it an accident.
You seem to have an interesting notion of "similarly named". name0[-2:] == name1[-2:], perhaps? The two functions (eventually, in the case of "reversed") return data in the order one would expect from their names.
x = [1, 3, 5, 2, 4, 6] sorted(x) [1, 2, 3, 4, 5, 6] reversed(x)
listreverseiterator object at 0x00AA5550
list(reversed(x)) [6, 4, 2, 5, 3, 1]-
Sorry; having re-read the message subject:
reversed came later; returning an iterator rather than a list provides more flexibility.
Cheers, John
I agree. Iterator is more flexible. Together and both might have returned the same types.
|
It's easy to generate a reversed sequence on the fly but impractical for a sorted one. Python is taking the pragmatic approach here.
Peter |
| |
| | | Fredrik Lundh |  |
| Posted: Fri Aug 22, 2008 5:14 am Post subject: Re: Sorted Returns List and Reversed Returns Iterator |  |
John Machin wrote:
| Quote: | reversed came later; returning an iterator rather than a list provides more flexibility.
|
As in flexibility for the implementer, the day someone invents a sort algorithm that doesn't have to look at all source items before it starts producing output?
Because I fail to see how returning an object that supports forward iteration only is more flexible for the *user* than returning an object that supports random access, mutation, restartable iteration, *and* forward iteration.
</F> |
| |
| | | ++imanshu |  |
| Posted: Fri Aug 22, 2008 5:17 am Post subject: Re: Sorted Returns List and Reversed Returns Iterator |  |
| |  | |
On Aug 22, 8:40 am, John Machin <sjmac...@lexicon.net> wrote:
| Quote: | On Aug 22, 1:35 pm, John Machin <sjmac...@lexicon.net> wrote:
On Aug 22, 12:12 pm, "++imanshu" <himanshu.g...@gmail.com> wrote:
Hi,
Is there a reason why two similarly named functions Sorted and Reversed return different types of data or is it an accident.
You seem to have an interesting notion of "similarly named". name0[-2:] == name1[-2:], perhaps? The two functions (eventually, in the case of "reversed") return data in the order one would expect from their names.
x = [1, 3, 5, 2, 4, 6] sorted(x) [1, 2, 3, 4, 5, 6] reversed(x)
listreverseiterator object at 0x00AA5550
list(reversed(x)) [6, 4, 2, 5, 3, 1]-
Sorry; having re-read the message subject:
reversed came later; returning an iterator rather than a list provides more flexibility.
Cheers, John
|
I agree. Iterator is more flexible. Together and both might have returned the same types.
Thanks, ++imanshu |
| |
| | | Terry Reedy |  |
| Posted: Fri Aug 22, 2008 5:36 am Post subject: Re: Sorted Returns List and Reversed Returns Iterator |  |
| |  | |
Peter Otten wrote:
| Quote: | ++imanshu wrote:
I agree. Iterator is more flexible.
|
I disagree. Neither is more flexible. You can iter the list returned by sorted and list the iter returned by reversed. Both do the minimum work necessary. See below.
| Quote: | Together and both might have returned the same types.
|
True, but only by doing potentially unnecessary work and requiring the caller to do potentially unnecessary work that might even prevent the program from working. This is less flexible.
Suppose sorted now returns alist with 50 million items. Suppose it instead returned iter(alist) but the caller wants to randomly index the items. Since the caller could not access the existing 50 million item list, the caller would have to make another 50 million item copy. This is non-trivial and might not even work do to memory limitations.
| Quote: | It's easy to generate a reversed sequence on the fly but impractical for a sorted one. Python is taking the pragmatic approach here.
|
To expand on this: sorting and reversing are algorithmically different operations. Sorting requires that one have all items in hand in a mutable sequence (list) for arbitrary re-ordering. Sorted works on any iterable and starts by making a new list. There is no point to not returning that list after it is sorted. It would be more work and less useful to do more.
sorted(iterable, key=None, reverse=False): newlist = list(iterable) newlist.sort(key, reverse) return newlist
Iterating over a concrete sequence in reverse order, on the other hand, is trivial. It would be more work and less useful to do more.
def _reversed(seq): # 'hidden' generator function n = len(seq) while n: n -= 1 yield seq[n]
def reversed(seq): if hasattr(seq, '__reversed__'): return seq.__reversed__() # I presume this is tried first else: return _reversed(seq) # generic fall-back
Terry Jan Reedy |
| |
| | | ++imanshu |  |
| Posted: Sat Aug 23, 2008 4:25 am Post subject: Re: Sorted Returns List and Reversed Returns Iterator |  |
| |  | |
On Aug 22, 12:36 pm, Terry Reedy <tjre...@udel.edu> wrote:
| Quote: | Peter Otten wrote: ++imanshu wrote: I agree. Iterator is more flexible.
I disagree. Neither is more flexible. You can iter the list returned by sorted and list the iter returned by reversed. Both do the minimum work necessary. See below.
> Together and both might have returned the same types.
True, but only by doing potentially unnecessary work and requiring the caller to do potentially unnecessary work that might even prevent the program from working. This is less flexible.
Suppose sorted now returns alist with 50 million items. Suppose it instead returned iter(alist) but the caller wants to randomly index the items. Since the caller could not access the existing 50 million item list, the caller would have to make another 50 million item copy. This is non-trivial and might not even work do to memory limitations.
It's easy to generate a reversed sequence on the fly but impractical for a sorted one. Python is taking the pragmatic approach here.
To expand on this: sorting and reversing are algorithmically different operations. Sorting requires that one have all items in hand in a mutable sequence (list) for arbitrary re-ordering. Sorted works on any iterable and starts by making a new list. There is no point to not returning that list after it is sorted. It would be more work and less useful to do more.
sorted(iterable, key=None, reverse=False): newlist = list(iterable) newlist.sort(key, reverse) return newlist
Iterating over a concrete sequence in reverse order, on the other hand, is trivial. It would be more work and less useful to do more.
def _reversed(seq): # 'hidden' generator function n = len(seq) while n: n -= 1 yield seq[n]
def reversed(seq): if hasattr(seq, '__reversed__'): return seq.__reversed__() # I presume this is tried first else: return _reversed(seq) # generic fall-back
Terry Jan Reedy
|
Thanks for giving the 'behind the scenes' reasons. It looks reasonable now.
Thank You, ++imanshu |
| |
|
|