二次元リストを縦に足す
l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print l # => [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # 転置 print zip(*l) # => [(1, 4, 7), (2, 5, 8), (3, 6, 9)] # 転置した後にタプルになるのが嫌? print map(list, zip(*l)) # => [[1, 4, 7], [2, 5, 8], [3, 6, 9]] # 転置した各行を足し合わせる print [reduce(lambda x, y: [x[0]+y], i, [0]) for i in zip(*l)] # => [[12], [15], [18]] # 要素一つならリストじゃなくてもいい? print [reduce(lambda x, y: x+y, i, 0) for i in zip(*l)] # => [12, 15, 18]
文字列から二次元リストに変換する。
a = '''1,2,3 4,5,6 7,8,9''' # 改行でsplitして得られたリストを','でsplitして、得られたリストの各要素をintに変換 l = [[int(i) for i in j.split(',')] for j in a.split('\n')] print l # => [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print [reduce(lambda x, y: [x[0]+y], i, [0]) for i in zip(*l)] # => [[12], [15], [18]]
intは意外と柔軟性があるみたいですね……。
a = '''11, 12, 13 14, 15 , 16 17,18 , 19''' print [[int(i) for i in j.split(',')] for j in a.split('\n')] # => [[11, 12, 13], [14, 15, 16], [17, 18, 19]]
>>> int(' 12 \r \n\n') 12 >>> int('\r\n 33\n') 33 >>> int('\r\n\n\n - \r\n\n 13 \n\n') -13 >>> int('2 7') Traceback (most recent call last): File "<stdin>", line 1, in ? ValueError: invalid literal for int(): 2 7