class_docstr: Composable cycles.
  
  This class has compositions methods:
  
  ``+``
    for 'inner' products (zip)
  
  ``+=``
    in-place ``+``
  
  ``*``
    for outer products (`itertools.product`) and integer multiplication
  
  ``*=``
    in-place ``*``
  
  and supports basic slicing via ``[]``.
  
  Parameters
  ----------
  left, right : Cycler or None
      The 'left' and 'right' cyclers.
  op : func or None
      Function which composes the 'left' and 'right' cyclers.
docstr: Values by key.
  
  This returns the transposed values of the cycler.  Iterating
  over a `Cycler` yields dicts with a single value for each key,
  this method returns a `dict` of `list` which are the values
  for the given key.
  
  The returned value can be used to create an equivalent `Cycler`
  using only `+`.
  
  Returns
  -------
  transpose : dict
      dict of lists of the values for each key.
code: def by_key(self) -> dict[K, list[V]]:
      """
      Values by key.
  
      This returns the transposed values of the cycler.  Iterating
      over a `Cycler` yields dicts with a single value for each key,
      this method returns a `dict` of `list` which are the values
      for the given key.
  
      The returned value can be used to create an equivalent `Cycler`
      using only `+`.
  
      Returns
      -------
      transpose : dict
          dict of lists of the values for each key.
      """
  
      # TODO : sort out if this is a bottle neck, if there is a better way
      # and if we care.
  
      keys = self.keys
      out: dict[K, list[V]] = {k: list() for k in keys}
  
      for d in self:
          for k in keys:
              out[k].append(d[k])
      return out
  
imports: from __future__ import annotations
  from collections.abc import Hashable, Iterable, Generator
  import copy
  from functools import reduce
  from itertools import product, cycle
  from operator import mul, add
  from typing import TypeVar, Generic, Callable, Union, Dict, List, Any, overload, cast
label_desc: Use image node_id 22 for calling the Cycler obj's underlying member method code with example usage: obj.by_key() and returns: out