[docs]defas_iterable(iterable_or_scalar):"""Utility for converting an object to an iterable. Parameters ---------- iterable_or_scalar : anything Returns ------- l : iterable If `obj` was None, return the empty tuple. If `obj` was not iterable returns a 1-tuple containing `obj`. Otherwise return `obj` Notes ----- Although string types are iterable in Python, we are treating them as not iterable in this method. Thus, as_iterable(string) returns (string, ) Examples --------- >>> as_iterable(1) (1,) >>> as_iterable([1, 2, 3]) [1, 2, 3] >>> as_iterable("my string") ("my string", ) """ifiterable_or_scalarisNone:return()elifisinstance(iterable_or_scalar,(str,bytes)):return(iterable_or_scalar,)elifhasattr(iterable_or_scalar,"__iter__"):returniterable_or_scalarelse:return(iterable_or_scalar,)
[docs]defunique_everseen(iterable,key=None):"""Yield unique elements, preserving order. Remember all elements ever seen. ``` unique_everseen('AAAABBBCCDAABBB') → A B C D unique_everseen('ABBcCAD', str.casefold) → A B c D ``` Source code: https://docs.python.org/3/library/itertools.html#itertools-recipes """seen=set()ifkeyisNone:forelementinfilterfalse(seen.__contains__,iterable):seen.add(element)yieldelementelse:forelementiniterable:k=key(element)ifknotinseen:seen.add(k)yieldelement