566. Reshape the Matrix

题目

在这里插入图片描述
这个题挺难的,首先得解决一个问题.把原来的数组拉平.
就像

 flat = sum(nums, [])

或者使用itertools.chain()
如:

import itertools
a= ['a','aa','aaa']
b= itertools.chain(a)
c= itertools.chain(*a)
print(a)
print(list(b))
print(list(c))

[‘a’, ‘aa’, ‘aaa’] 
[‘a’, ‘aa’, ‘aaa’] 
[‘a’, ‘a’, ‘a’, ‘a’, ‘a’, ‘a’]

或者这样,

 def flatten(l):
for el in l:
if hasattr(el, "__iter__") and not isinstance(el, basestring):
for sub in flatten(el):
yield sub
else:
yield el
  l = [1, 2, [3, 4, [5, 6]], ["abc", "def"]]
l2 = [x for x in flatten(l)]
print l2

或者,

items = [y for x in nums for y in x]

代码

class Solution(object):
    def matrixReshape(self, nums, r, c):
        import itertools
        flat=list(itertools.chain(*nums))
        new=[]
        if r*c==len(nums)*len(nums[0]):
            for k in range(r):
                new.append(flat[k*c:(k+1)*c])
          
            return new
        return nums     

方案1: numpy 方法:(简单易懂)

import numpy as np

class Solution(object):
    def matrixReshape(self, nums, r, c):
        try:
            return np.reshape(nums, (r, c)).tolist()
        except:
            return nums

方案2: Oneliner

def matrixReshape(self, nums, r, c):
    return nums if len(sum(nums, [])) != r * c else map(list, zip(*([iter(sum(nums, []))]*c)))

可读性更高的版本:

def matrixReshape(self, nums, r, c):
    flat = sum(nums, [])
    if len(flat) != r * c:
        return nums
    tuples = zip(*([iter(flat)] * c))
    return map(list, tuples)

其中,map函数:

def f(x):
    return x*x
print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])

方案3:

def matrixReshape(self, nums, r, c):
    if r * c != len(nums) * len(nums[0]):
        return nums
    it = itertools.chain(*nums)
    return [list(itertools.islice(it, c)) for _ in xrange(r)]
class Solution(object):
    def matrixReshape(self, nums, r, c):
        """
        :type nums: List[List[int]]
        :type r: int
        :type c: int
        :rtype: List[List[int]]
        """
        if len(nums[0])*len(nums) != r*c:
            return nums
        else:
            items = [y for x in nums for y in x]
            return [items[x*c : ((x+1)*c)] for x in range(r)]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值