pythonでflatten

def flatten(ls):
    """
    >>> flatten([1, [2, 3], [4], 5, [6, [7]]])
    [1, 2, 3, 4, 5, 6, 7]
    """
    return sum((flatten(i) for i in ls), []) if isinstance(ls, list) else [ls]

大して変わらないと思うけど、flatten化するgeneratorをsumするのと、reduceするのとどっちが効率がいいのだろうか?

def flatten(ls):
  if not isinstance(ls, list): return [ls]
  return reduce(lambda s, i: s + flatten(i), ls, []) 

generator版faltten

def flatten(ls):
    """
    >>> list(flatten([1, [2, 3], [4], 5, [6, [7]]]))
    [1, 2, 3, 4, 5, 6, 7]
    """
    if not isinstance(ls, list): yield ls
    else:
        for i in ls:
            for _ in flatten(i): yield _
            pass
        pass
    pass

おまけ: median(中央値)

def median(ls):
    return sorted(ls)[len(ls) // 2]