4 ms·
That fails for sets and other non-list iterables. It would have to be something like: def get_single(l): i = iter(l) val = i.next() try:
by orangecat 16y ago
That fails for sets and other non-list iterables. It would have to be something like:
def get_single(l):
i = iter(l)
val = i.next()
try:
i.next() # expected to throw exception for one-element iterable
except StopIteration:
return val
raise AssertionError('More than one object')
Eww.
- viraptor 16y agoYou don't need to do that for a set. sets support `len()`. Also set supports `pop()`, so the code is very similar to the list one: assert s and len(s)==1 return s.pop() Or if you want to stay in the immutable land: assert s and len(s)==1 return tuple(s)[0]
- mccutchen 16y agoBoth of those still fail for other non-list iterables, like generators.
- robrenaud 16y agoThey also have the side effect of removing an item from the collection.
- lehmannro 16y agoA property which is exposed by the article's solution too: >>> x = (lambda: (yield 1))() # generator with one step >>> y = tuple(x)[0] >>> y 1 >>> list(x) # exhausted [] >>> x = (lambda: (yield 1))() >>> y, = x >>> y 1 >>> list(x) # exhausted, too! [] Because that's just what you inevitably need to do to fetch a value from a generator. There is no peeking action or some such.
- deleted 16y ago[deleted]
- j_baker 16y agoPersonally, I'm willing to restrict this to just lists to keep things simple. I rarely ever need a way to extract one value from a list, set, and iterable.