【问题标题】:Advanced array concatenation python高级数组连接python
【发布时间】:2016-10-15 13:01:51
【问题描述】:

假设我有四个多维数组 -

a = [["a","a","a"],
    ["a","a","a"],
    ["a","a","a"]]
b = [["b","b","b"],
    ["b","b","b"],
    ["b","b","b"]]
c = [["c","c","c"],
    ["c","c","c"],
    ["c","c","c"]]
d = [["d","d","d"],
    ["d","d","d"],
    ["d","d","d"]]

我想将它们组合成一个数组,例如

total = [["a","a","a","b","b","b"],
        ["a","a","a","b","b","b"],
        ["a","a","a","b","b","b"], 
        ["c","c","c","d","d","d"],
        ["c","c","c","d","d","d"],
        ["c","c","c","d","d","d"]]

我该怎么做?

我这样做是为了生成 spelunky 风格的地图

【问题讨论】:

    标签: python arrays pygame concatenation


    【解决方案1】:

    可能是这样的:

    top = list(x+y for x,y in zip(a,b))
    bottom = list(x+y for x,y in zip(c,d))
    total = top + bottom
    
    for r in total: print(r)
    

    输出:

    ['a', 'a', 'a', 'b', 'b', 'b']
    ['a', 'a', 'a', 'b', 'b', 'b']
    ['a', 'a', 'a', 'b', 'b', 'b']
    ['c', 'c', 'c', 'd', 'd', 'd']
    ['c', 'c', 'c', 'd', 'd', 'd']
    ['c', 'c', 'c', 'd', 'd', 'd']
    

    【讨论】:

      【解决方案2】:

      您可以使用单行指令来完成,该指令将列表理解、zip 指令和列表连接与+ 混合在一起

      [aa+bb for aa,bb in zip(a,b)] + [cc+dd for cc,dd in zip(c,d)]
      

      整个代码

      a = [["a","a","a"],
          ["a","a","a"],
          ["a","a","a"]]
      b = [["b","b","b"],
          ["b","b","b"],
          ["b","b","b"]]
      c = [["c","c","c"],
          ["c","c","c"],
          ["c","c","c"]]
      d = [["d","d","d"],
          ["d","d","d"],
          ["d","d","d"]]
      result = [aa+bb for aa,bb in zip(a,b)] + [cc+dd for cc,dd in zip(c,d)]
      

      【讨论】:

        【解决方案3】:

        假设您的地图布局比 2x2 块更复杂:

        from itertools import chain
        from pprint import pprint
        
        
        a = [["a","a","a"],
             ["a","a","a"],
             ["a","a","a"]]
        b = [["b","b","b"],
             ["b","b","b"],
             ["b","b","b"]]
        c = [["c","c","c"],
             ["c","c","c"],
             ["c","c","c"]]
        d = [["d","d","d"],
             ["d","d","d"],
             ["d","d","d"]]
        e = [["e","e","e"],
             ["e","e","e"],
             ["e","e","e"]]
        f = [["f","f","f"],
             ["f","f","f"],
             ["f","f","f"]]
        
        layouts = [
            ((a, b), (c, d)),
            ((a, b, c), (d, e, f)),
            ((a, b), (c, d), (e, f)),
        ]
        
        for layout in layouts:
            total = [list(chain(*row)) for lrow in layout for row in zip(*lrow)]
            pprint(total)
        

        输出:

        [['a', 'a', 'a', 'b', 'b', 'b'],
         ['a', 'a', 'a', 'b', 'b', 'b'],
         ['a', 'a', 'a', 'b', 'b', 'b'],
         ['c', 'c', 'c', 'd', 'd', 'd'],
         ['c', 'c', 'c', 'd', 'd', 'd'],
         ['c', 'c', 'c', 'd', 'd', 'd']]
        
        [['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'],
         ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'],
         ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'],
         ['d', 'd', 'd', 'e', 'e', 'e', 'f', 'f', 'f'],
         ['d', 'd', 'd', 'e', 'e', 'e', 'f', 'f', 'f'],
         ['d', 'd', 'd', 'e', 'e', 'e', 'f', 'f', 'f']]
        
        [['a', 'a', 'a', 'b', 'b', 'b'],
         ['a', 'a', 'a', 'b', 'b', 'b'],
         ['a', 'a', 'a', 'b', 'b', 'b'],
         ['c', 'c', 'c', 'd', 'd', 'd'],
         ['c', 'c', 'c', 'd', 'd', 'd'],
         ['c', 'c', 'c', 'd', 'd', 'd'],
         ['e', 'e', 'e', 'f', 'f', 'f'],
         ['e', 'e', 'e', 'f', 'f', 'f'],
         ['e', 'e', 'e', 'f', 'f', 'f']]
        

        【讨论】:

        • 谢谢你 - 这是完美的
        【解决方案4】:

        既然你在谈论数组,使用numpy数组和hstack()vstack()

        import numpy as np
        
        ab = np.hstack((np.array(a),np.array(b)))
        cd = np.hstack((np.array(c),np.array(d)))
        
        print np.vstack((ab,cd))
        

        哪个引导你:

        [['a' 'a' 'a' 'b' 'b' 'b']
         ['a' 'a' 'a' 'b' 'b' 'b']
         ['a' 'a' 'a' 'b' 'b' 'b']
         ['c' 'c' 'c' 'd' 'd' 'd']
         ['c' 'c' 'c' 'd' 'd' 'd']
         ['c' 'c' 'c' 'd' 'd' 'd']]
        

        或者,使用concatenate():

        ab = np.concatenate((np.array(a),np.array(b)),axis=1)
        cd = np.concatenate((np.array(c),np.array(d)),axis=1)
        
        print np.concatenate((ab,cd))
        

        【讨论】:

        • 或者等价地使用np.hstack()np.vstack()
        • 非常感谢,太棒了!我相应地更改了代码。
        猜你喜欢
        • 2016-09-18
        • 1970-01-01
        • 1970-01-01
        • 2022-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多