鱼C论坛

 找回密码
 立即注册
查看: 4577|回复: 17

[已解决]Python:每日一题 177

[复制链接]
发表于 2018-5-26 12:30:20 | 显示全部楼层 |阅读模式
50鱼币
本帖最后由 新手·ing 于 2018-5-26 12:49 编辑

【矩阵转置】
输入一个矩阵字符串srcStr,输出这个矩阵的转置矩阵;

说明:
输入将以“用半角逗号隔开列,用半角分号隔开行”来描述矩阵

比如,输入的字符串格式定义如下:
a,b,c,d,e;f,g,h,i,j;k,l,m,n,o;p,q,r,s,t
其表示的矩阵如下:
a        b        c        d        e
f        g        h        i        j
k        l        m        n        o
p        q        r        s        t

注意,判题用例中输入字符串不保证每行列数一样,所以无法保证输入的字符串能换转成矩阵;解题注意处理与判断;
【输出】:string  转置之后的矩阵字符串
若不能转置,输出“impossible”

输出的字符串格式定义如下(中间无空格):
a,f,k,p;b,g,l,q;c,h,m,r;d,i,n,s;e,j,o,t

其表示的矩阵如下:

a        f        k        p
b        g        l        q
c        h        m        r
d        i        n        s
e        j        o        t
最佳答案
2018-5-26 12:30:21
  1. import numpy

  2. def fun(s):
  3.     x = numpy.transpose( row.split(',') for row in s.split(';') )
  4.     ret = ';'.join( ','.join(x[i]) for i in range( len(x)) )
  5.     return ret if s != ret else 'impossible'
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-26 12:30:21 | 显示全部楼层    本楼为最佳答案   
  1. import numpy

  2. def fun(s):
  3.     x = numpy.transpose( row.split(',') for row in s.split(';') )
  4.     ret = ';'.join( ','.join(x[i]) for i in range( len(x)) )
  5.     return ret if s != ret else 'impossible'
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-26 14:12:26 | 显示全部楼层
str1 = 'a,b,c,d,e;f,g,h,i,j;k,l,m,n,o;p,q,r,s,t'
list1 = []
for i in str1:
    list1.append(i)
while ',' in list1:
    list1.remove(',')
while ';' in list1:
    list1.remove(';')
if len(list1) % 5 == 0:
    str2 =str1.replace(',', '\t')
    str3 =str2.replace(';', '\n')
    print(str3)
else:
    print('不能形成矩阵')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-26 21:36:59 | 显示全部楼层
本帖最后由 asdfg5954457 于 2018-5-27 17:09 编辑

matrix = input('輸入矩陣')

matrixS = matrix.split(';')
matrixC = ''
totalrow = len(matrixS)
columns_in_row1 = len(matrixS[0].split(','))
bull = 0

for eachrow in range(totalrow):
    bull += abs(len(matrixS[eachrow].split(','))-columns_in_row1)
        
if bull == 0:
    for eachcolumn in range(columns_in_row1):
        for eachrow in range(totalrow):
            matrixC = matrixC + matrixS[eachrow].split(',')[eachcolumn] + ','

        matrixC = matrixC.rstrip(',')
        matrixC = matrixC + ';'
    matrixC = matrixC.rstrip(';')
    print(matrixC)
else:
    print('impossible')

逗號跟分號的處理似乎是有點不漂亮,不過目前也沒想到其他比較合適的方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-26 22:33:47 | 显示全部楼层
完全没用过矩阵的函数,觉得好久没敲动脑子的代码,迟钝了,,
  1. def f(x):
  2.     lst=x.replace(',','').split(';')
  3.     print(lst)
  4.     l=len(lst[0])
  5.     L=len(lst)
  6.     tlst=[]
  7.     for i in range(L):
  8.         if len(lst[i])!=l:
  9.             print('impossible')
  10.             return 0
  11.     for j in range(l):
  12.         for i in range(L):
  13.             print(lst[i][j]+'\t',end='')
  14.         print()
  15. srcStr='a,b,c,d,e;f,g,h,i,j;k,l,m,n,o;p,q,r,s,t'
  16. f(srcStr)
  17. f(srcStr[:-1])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-27 05:27:28 | 显示全部楼层
# -*- coding:utf-8 -*-
def Rransposition_Str_Matrix(Str1):
    m=Str1.count(';')+1
    n=Str1.count(',')/m+1
    if m != n:
        print('不能形成矩阵')
    else:
        a=[[0 for i in range(m)] for j in range(n)]
        list1=Str1.replace(',','').split(';')
        Str2 = Str1
        for i in range(m):
            for j in range(n):
                a[i][j]=list1[j][i]

        for i in a:
            b = '  '.join(i)
            print(b)

srcStr='a,b,c,d,e;f,g,h,i,j;k,l,m,n,o;p,q,r,s,t;u,v,w,x,y'
Rransposition_Str_Matrix(srcStr)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-27 05:28:12 | 显示全部楼层
# -*- coding:utf-8 -*-
def Rransposition_Str_Matrix(Str1):
    m=Str1.count(';')+1
    n=Str1.count(',')/m+1
    if m != n:
        print('不能形成矩阵')
    else:
        a=[[0 for i in range(m)] for j in range(n)]
        list1=Str1.replace(',','').split(';')
        Str2 = Str1
        for i in range(m):
            for j in range(n):
                a[i][j]=list1[j][i]

        for i in a:
            b = '  '.join(i)
            print(b)

srcStr='a,b,c,d,e;f,g,h,i,j;k,l,m,n,o;p,q,r,s,t;u,v,w,x,y'
Rransposition_Str_Matrix(srcStr)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-27 05:32:22 | 显示全部楼层
# -*- coding:utf-8 -*-
def Rransposition_Str_Matrix(Str1):
    m=Str1.count(';')+1
    n=Str1.count(',')/m+1
    if m != n:
        print('不能形成矩阵')
    else:
        a=[[0 for i in range(m)] for j in range(n)]
        list1=Str1.replace(',','').split(';')
        Str2 = Str1
        for i in range(m):
            for j in range(n):
                a[i][j]=list1[j][i]

        for i in a:
            b = '  '.join(i)
            print(b)

srcStr='a,b,c,d,e;f,g,h,i,j;k,l,m,n,o;p,q,r,s,t;u,v,w,x,y'
Rransposition_Str_Matrix(srcStr)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-27 19:21:19 | 显示全部楼层
用zip做转置。
  1. srcStr = 'a,b,c,d,e;f,g,h,i,j;k,l,m,n,o;p,q,r,s,t'
  2. list1 = [i.split(',') for i in srcStr.split(';')]
  3. if len(set([len(i) for i in list1])) == 1:
  4.     print(';'.join([','.join(i) for i in zip(*list1)]))
  5. else:
  6.     print('impossible!')

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-28 10:20:43 | 显示全部楼层
  1. def fun177(x):
  2.     x = x.split(';')
  3.     for n in x:
  4.         if len(n) != len(x[0]):
  5.             print('impossible')
  6.             break
  7.     else:
  8.         for i in x:
  9.             i = [a for a in i if a != ',']
  10.             for j in i:
  11.                 if j == i[-1]:
  12.                     print(j)
  13.                 else:
  14.                     print(j,end=' ')

  15. if __name__ == '__main__':
  16.     x = str(input('请输入字符串:'))
  17.     fun177(x)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-28 21:56:34 | 显示全部楼层
看起来题目就是普通的矩阵转置啊,怎么现在没什么人答题了,
可能这几天大伙欧冠和NBA东西决复盘吧
元素是字符串比较奇怪
手动做也不麻烦
  1. def fun(string):
  2.     lst = [i.split(',') for i in string.split(';')]
  3.     if any(len(i)-len(lst[0]) for i in lst):
  4.         return "impossible"
  5.     else:
  6.         return [[row[i] for row in lst] for i in range(len(lst[0]))]
复制代码

如果字符串是为了代数运算,那sympy貌似可以派上用场
  1. from sympy import Matrix
  2. from sympy.abc import *

  3. def fun2(string):
  4.     lst = [i.split(',') for i in string.split(';')]
  5.     try:
  6.         return Matrix(lst).transpose()
  7.     except ValueError:
  8.         return "impossible"
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-28 22:18:49 | 显示全部楼层
  1. def generate_matrix(input_str):
  2.     elements_list = input_str.split(";")
  3.     matrix = []
  4.     for each in elements_list:
  5.         matrix.append(each.split(","))

  6.     return matrix

  7. def matrix_transpose(matrix):
  8.     if len(set([len(i) for i in matrix])) != 1:
  9.         return "Impossible"
  10.     else:
  11.         transpose_matrix = [[] for i in range(len(matrix[0]))]
  12.         for each in matrix:
  13.             for i in range(len(each)):
  14.                 transpose_matrix[i].append(each[i])
  15.         return transpose_matrix

  16. def output_matrix(matrix):
  17.     if isinstance(matrix, str):
  18.         return matrix
  19.     else:
  20.         str_list = []
  21.         for each in matrix:
  22.             str_list.append(','.join(each))

  23.         return ';'.join(str_list)

  24. if __name__ == '__main__':
  25.     s = input("Please input your matrix:")
  26.     transpose_mat = matrix_transpose(generate_matrix(s))
  27.     if transpose_mat != "Impossible":
  28.         for each in transpose_mat:
  29.             for i in each:
  30.                 print(i, end=' ')
  31.             print()
  32.     else:
  33.         print(transpose_mat)
  34.     print(output_matrix(transpose_mat))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-29 08:42:35 | 显示全部楼层
  1. strings = 'a,b,c,d,e;f,g,h,i,j;k,l,m,n,o;p,q,r,s,t'


  2. def matrix(string):
  3.     lst = string.split(';')
  4.     tmp = list(map(len, lst))

  5.     if sum(tmp) == tmp[0] * len(tmp):
  6.         for i in lst:
  7.             print('')
  8.             for j in i:
  9.                 if j != ',':
  10.                     print('{0:^2}'.format(j), end='')
  11.     else:
  12.         print('impossible')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-29 11:09:25 | 显示全部楼层
  1. def transpose(s):   
  2.     arr=[x.split(',') for x in s.split(';')]
  3.     lenth=len(arr[0])
  4.     if [x for x in arr if len(x)!=lenth]:
  5.         return 'impossible'
  6.     return ';'.join(','.join([x[k] for x in arr]) for k in range(lenth))
  7.         

  8. s='a,b,c,d,e;f,g,h,i,j;k,l,m,n,o;p,q,r,s,t'
  9. print(transpose(s))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-31 11:31:32 | 显示全部楼层
本帖最后由 z1446773686 于 2018-5-31 14:31 编辑

def matr(x,y,coe_list,str1):
    count = 1
    max_x = max(x,y)
    min_y = min(x,y)
   
    if  min_y != 1 and len(str1) / max_x == min_y:   
        for each in str1:
            print(each,end = ' ')
            if not count % max_x:
                print('\n')
            count += 1
    else:
        print('此字符串矩阵不成立')
   
def pro(coe_list,str1):
    tit = 1
    print('pro',coe_list)

    for each in range(len(coe_list)-1):
        tit *= coe_list[each]
            
    #print(tit,coe_list[-1])
            
    return matr(tit,coe_list[-1],coe_list,str1)
        
def coe(str1):   
    coe_n = len(str1)
    coe_list = []
    coe_k = 2
   
    while(coe_k<=(int(coe_n/2)+1) or not coe_n % coe_k ):
        while(coe_n % coe_k):
            coe_k += 1
        coe_list.append(coe_k)
        coe_n /= coe_k
    print('coe',coe_list)   
    if len(str1) > 3:
        x = 1
        y = 1
        if not len(coe_list)%2 and len(coe_list) > 2:
            for each in range(int(len(coe_list)/2)):
                x *= coe_list[each]

            y = x
            
            coe_list = []   
            coe_list.append(x)
            coe_list.append(y)
            
        return pro(coe_list,str1)
   
    else:
        print('此字符串矩阵不成立')
        
        return 0,0

def split_str1(str1):
    str1 = list(str1)
    index = 0
   
    while(',' in str1):
        if str1[index] == ',':
            del str1[index]
            index -= 1
            
        if index > len(str1):
            index = 0
            
        index += 1

    return coe(str1)

while(True):
    str1 = input('请输入一个字符串用逗号隔开中间不要有空格:')
    split_str1(str1)
#print(len(str2))
'''
coe_list,str1 = coe(str2)
x,y = pro(coe_list,str1)
matr(x,y,str2)
'''

大佬们都这么厉害果真我写的是最长的,哎,慢慢来不着急
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-5-31 11:33:06 | 显示全部楼层

..

本帖最后由 z1446773686 于 2018-5-31 11:35 编辑

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-3-7 17:19:59 | 显示全部楼层
  1. def test177(srcstr):
  2.     aa = [i.split(',') for i in srcstr.split(';')]
  3.     if len(set(len(i) for i in aa)) != 1:
  4.         print('impossible')
  5.     else:
  6.         newlist = [[aa[i][j] for i in range(len(aa))] for j in range(len(aa[0]))]
  7.         print(';'.join([','.join(i) for i in newlist]))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-6 10:37:48 | 显示全部楼层
本帖最后由 kinkon 于 2022-9-6 10:41 编辑
  1. srcStr = 'a,b,c,d,e;f,g,h,i,j;k,l,m,n,o;p,q,r,s,t'

  2. arr = [k for k in srcStr.replace(',','').split(';')]
  3. brr = ';'.join([','.join(a) for a in zip(*arr)])
  4. print(brr) if len(brr) == len(srcStr) else print('impossible')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 09:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表