11.2-转置矩阵解法

作者: BeautifulSoulpy | 来源:发表于2019-08-28 09:04 被阅读0次

    如果一个人比你优秀,你尽可以放心交往,因为优秀的人散发正能量!如果一个人有德行,你尽量与他成为一个团队,因为厚德载物!如果一个人有智慧,你尽可安心与他同行,相信智慧能照亮未来!如果一个人活的生命有质量,你可用心与他成为知己,生命才有高度与宽度。

    遇到问题,不要盲目的下结论;
    每一道题都是我们精心筛选的;

    练习2: 给定一个3*3的方阵,求其转置矩阵;

    出题意图:给你一个转置矩阵,请你用我们的数据结构(list)来描述它;
    最常见的数据结构是列表list

    方法1:print打印;可能会被面试官鄙视0分;
    不要一上来就用print,面试官可能认为你不会算法;
    
    m = '1 2 3\n4 5 6\n7 8 9'
    #print(m)
    l_c=len(m.split('\n'))   #3
    m=m.split()     #->list[]
    l_row=len(m)//l_c   #  3
    
    for i in range(l_row):
        for j in range(l_c):
            print(m[j*3+i],end=' ')
        print('\r')
    ---------------------------------------------------------------
    1 4 7 
    2 5 8 
    3 6 9 
    
    
    方法2 :方阵(二维数组)  转换 j !=i 的时候交换 ;
    
    m = [[1,2,3],[4,5,6],[7,8,9]]   #写成二维数组;
    for i in range(3):
        for j in range(i):
            m[i][j],m[j][i]=m[j][i],m[i][j]   # 3 维方阵交换3次;   数值为 0 、1、2;
    print(m)
    -----------------------------
    1 4 7 
    2 5 8 
    3 6 9 
    
    总结:
    # for 循坏的几种写法含义理解不深: 
    for i in lst:
        for j in lst:
    
    for i in lst;
        for j in i:
            
    # 优化方案:
    # 1.对角线的取值,是否交换;
    # 2.写成data写成 二维数组,否则会绕大湾子;
    # 3.数组不建议进行二次索引,二次索引是建立在list中都是单个字符的情况;
    
    
    方法3: 矩阵的打印;不打印对角线
    
    lst1=[[1,2,3],[4,5,6],[7,8,9]]
    
    for x in range(len(lst1)):
        for y in range(len(lst1[x])):
            if y>x:   # 除去对角线的打印;
                lst1[x][y],lst1[y][x]=lst1[y][x],lst1[x][y]
    lst1
    -----------------------------
    [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
    
    方法3 enumerate() 函数的使用
    
    
    enumerate() 函数的使用

    enumerate是类似生成器的可迭代对象;
    enumerate(sequence, [start=0])
    enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

    >>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
    >>>list(enumerate(seasons))
    [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
    >>>list(enumerate(seasons, start=1))       # 小标从 1 开始
    [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
    

    3.3 # 给定一个不规则矩阵(23)的方阵,求其转置矩阵(有点难为人)*

    方法1: enumerate()函数写法;
    lst=[[1,2,3],[4,5,6]]
    
    for i,y in enumerate(lst[1],1):
        print(i,y)
    -------------------------
    1 4
    2 5
    3 6
    
    
    方法2:enumerate + append 方法 ;
    matrix = [[1,2,3],[4,5,6]]
    
    tm = []
    for row in matrix:
        print(row)
        for i, col in enumerate(row):
            if len(tm) < (i+1):   #动态创建;
                tm.append([])
            tm[i].append(col)
    
    print(tm)
    ----------------------------------------
    [1, 2, 3]
    [4, 5, 6]
    [[1, 4], [2, 5], [3, 6]]
    
    
    方法3:一此行开辟所有空间+列表解析式;
    
    m = [[1,4],[2,5],[3,6]]
    # tm = [[0]*2]*3   # 3*2
    tm = [[0 for col in range(len(m))] for row in range(len(m[0]))]  #开辟空间 ;列表解析式 效率更高;
    count = 0
    
    for i,row in enumerate(tm):
        for j,col in enumerate(row):
            tm[i][j] = m[j][i]  #将m所有的元素搬到tm中;一次都少不了
            count+ = 1
    print(m)
    print(tm)
    print(count)
    ----------------------------------------
    [[1, 4], [2, 5], [3, 6]]
    [[1, 2, 3], [4, 5, 6]]
    6
    
    总结:
    1. tm = [[0 for col in range(len(m))] for row in range(len(m[0]))]  #开辟空间 ;列表解析式;
    2. tm[i][j] = m[j][i]  #将m所有的元素搬到tm中;一次都少不了
    3. 不要盲目的下结论:append方法与for循坏迭代快慢比较:可能的原因:数据的规模大小,而不是append比for快;
    
    方法3: append方法
    
    m=[[1,2,3],[4,5,6]]
    
    tm = []
    count = 0
    for row in m:
        for i,col in enumerate(row):
            if len(tm)<i+1:   # m有i列就要为tm创建i行;
                tm.append([])
    
            tm[i].append(col)
            count += 1
    
    print(m)
    print(tm)
    print(count)
    ------------------------------------------
    [[1, 2, 3], [4, 5, 6]]
    [[1, 4], [2, 5], [3, 6]]
    6
    
    
    数字统计
    3.4 # 随机产生10个数字【10,20】,统计重复的数字有几个;不重复的数字有几个,分别是什么?
    #4.随机生成10个数字;统计重复和不重复数字的个数和值;
    方法1:list count 实现方法
    lst = []
    for i in range(10):
        lst.append(random.randint(1,20))
    
    lst1 = []
    m = 0
    for i in range(10):
        #print(lst[i],lst.count(lst[i]))
        n = lst.count(lst[i])
        if n>1 and lst[i] not in lst1:
            lst1.append(lst[i])
            m += 1
    print('重复的数字有{}个,分别为{}'.format(m,lst1))
    ---------------------------------------------------------------
    重复的数字有3个,分别为[14, 2, 13]
    
    
    解法2:
    
    import random
    
    nums = []
    for _ in range(10):    # for循坏的i值可以为任意;包括符号
        nums.append(random.randint(1,20))
    
    print("Origin numbers = {}".format(nums))
    print('-----------------------------------')
    
    length = len(nums)
    samenums = [] #记录相同的数字;
    diffnums = [] #记录不同的数字;
    states = [0]*length  #记录不同的索引状态;
    
    for i in range(length):
        flag = False  #假定没有重复;
        if states[i] == 1:
            continue
        for j in range(i+1,length):
            if states[j] == i:
                continue
            if nums[i] == nums[j]:
                flag = True
                states[j] = 1
        if flag: #有重复;
            samenums.append(nums[i])
            states[i] = 1
        else:
            diffnums.append(nums[i])
            
    print("Same numbers = {1},Counter={0}".format(len(samenums),samenums))
    print("Different numbers = {1},Counter={0}".format(len(diffnums),diffnums))
    print(list(zip(states,nums)))
    -----------------------------------------------------------------------------------
    Origin numbers = [1, 7, 5, 14, 10, 19, 8, 9, 10, 11]
    -----------------------------------
    Same numbers=[10],Counter=1
    Different numbers=[1, 7, 5, 14, 19, 8, 9, 11],Counter=8
    [(0, 1), (0, 7), (0, 5), (0, 14), (1, 10), (0, 19), (0, 8), (0, 9), (1, 10), (0, 11)]
    
    
    总结:
     1. for循坏的i值可以为任意;包括符号;
    

    相关文章

      网友评论

        本文标题:11.2-转置矩阵解法

        本文链接:https://www.haomeiwen.com/subject/blguectx.html