Python program to split a list into two lists with alternating elements

后端 未结 4 1552
日久生厌
日久生厌 2020-11-29 10:37

Can you make it more simple/elegant?

def zigzag(seq):
    \"\"\"Return two sequences with alternating elements from `seq`\"\"\"
    x, y = [], []
    p, q =          


        
相关标签:
4条回答
  • 2020-11-29 10:43
    def zigzag(seq):
        return seq[::2], seq[1::2]
    
    0 讨论(0)
  • 2020-11-29 10:43

    I just wanted to clear something. Say you have a list

    list1 = list(range(200))
    

    you can do either :

    ## OPTION A ##
    a = list1[1::2]
    b = list1[0::2]
    

    or

    ## OPTION B ##
    a = list1[0:][::2] # even
    b = list1[1:][::2] # odd
    

    And get have alternative elements in variable a and b.

    But OPTION A is twice as fast

    0 讨论(0)
  • 2020-11-29 10:59

    If seq, as you say, is a list, then:

    def zigzag(seq):
      return seq[::2], seq[1::2]
    

    If seq is a totally generic iterable, such as possibly a generator:

    def zigzag(seq):
      results = [], []
      for i, e in enumerate(seq):
        results[i%2].append(e)
      return results
    
    0 讨论(0)
  • 2020-11-29 11:04

    This takes an iterator and returns two iterators:

    import itertools
    def zigzag(seq):
        t1,t2 = itertools.tee(seq)
        even = itertools.islice(t1,0,None,2)
        odd = itertools.islice(t2,1,None,2)
        return even,odd
    

    If you prefer lists then you can return list(even),list(odd).

    0 讨论(0)
提交回复
热议问题