Is the goal to allow them to consume a finite generator of *unknown* length (requires reservoir sampling https://en.wikipedia.org/wiki/Reservoir_sampling with N random calls, which seemed to be the rub before?) or just consume a generator with known length that's not indexable (a rare beast?). Consuming iterables if they have a length like below wouldn't be so bad, but might be too niche.
class X: def __init__(self, ele): self.ele = ele def __len__(self): return len(self.ele) def __iter__(self): return iter(self.ele) x = X([1, 2, 3, 4, 5]) random.choice(x) # TypeError: 'X' object does not support indexing Would allowing an optional 'len' argument alongside the iterator to sample/choice be too narrow to be useful? On Wed, Nov 30, 2016 at 2:21 PM, Bernardo Sulzbach < mafagafogiga...@gmail.com> wrote: > On 2016-11-30 17:57, Chris Kaynor wrote: > >> On Wed, Nov 30, 2016 at 11:52 AM, Chris Kaynor <ckay...@zindagigames.com> >> wrote: >> >>> There are also issues with how it should behave on iterables that >>> cannot be re-iterated (eg, random.choice will consume the iterator, >>> and could only be called once safely). >>> >> >> I meant to include a sample in my previous e-mail: >> >> Consider that this code will not produce the "correct" results (for a >> reasonable definition of correct): >> >> a = (i for i in range(100)) # Pretend this does something more >> interesting, and isn't a trivial generator - maybe a file object >> reading by line. >> randomEntries = [random.choice(a) for i in range(10)] >> > > In such a case you should explicitly use a sample. > > I see your example as the caller's fault, which ignored the fact that the > iterator would change after calls to choice. > > Hold the first 10 (in this case). For every subsequent element, randomly > choose to replace one of the "held" ones by it (with a diminishing > probability). > > Assume this does not offer the same performance as loading everything into > memory. But it isn't meant to do so, as if you need / can / want, you could > just shove it all into a list and use what we currently have. > > -- > Bernardo Sulzbach > http://www.mafagafogigante.org/ > mafagafogiga...@gmail.com > _______________________________________________ > Python-ideas mailing list > Python-ideas@python.org > https://mail.python.org/mailman/listinfo/python-ideas > Code of Conduct: http://python.org/psf/codeofconduct/ >
_______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/