Interleave multiple lists of the same length in Python

后端 未结 9 1556
刺人心
刺人心 2020-11-22 10:11

In Python, is there a good way to interleave two lists of the same length?

Say I\'m given [1,2,3] and [10,20,30]. I\'d like to transform th

9条回答
  •  [愿得一人]
    2020-11-22 10:34

    To answer the question's title of "Interleave multiple lists of the same length in Python", we can generalize the 2-list answer of @ekhumoro. This explicitly requires that the lists are the same length, unlike the (elegant) solution by @NPE

    import itertools
    
    def interleave(lists):
        """Interleave a list of lists.
    
        :param lists: List of lists; each inner length must be the same length.
        :returns: interleaved single list
        :rtype: list
    
        """
        if len(set(len(_) for _ in lists)) > 1:
            raise ValueError("Lists are not all the same length!")
        joint = list(itertools.chain(*lists))
        for l_idx, li in enumerate(lists):
            joint[l_idx::len(lists)] = li
        return joint
    

    Examples:

    >>> interleave([[0,2,4], [1, 3, 5]])
    [0, 1, 2, 3, 4, 5]
    >>> interleave([[0,2,4], [1, 3, 5], [10, 11, 12]])
    [0, 1, 10, 2, 3, 11, 4, 5, 12]
    >>> interleave([[0,2,4], [1, 3, 5], [10, 11, 12], [13, 14, 15]])
    [0, 1, 10, 13, 2, 3, 11, 14, 4, 5, 12, 15]
    >>> interleave([[0,2,4], [1, 3, 5], [10, 11, 12], [13, 14]])
    Traceback (most recent call last):
      File "", line 1, in 
      File "", line 10, in interleave
    ValueError: Lists are not all the same length!
    >>> interleave([[0,2,4]])
    [0, 2, 4]
    

提交回复
热议问题