鱼C论坛

 找回密码
 立即注册
查看: 4167|回复: 32

[技术交流] Python:每日一题 141

[复制链接]
发表于 2018-1-13 18:32:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 2018-2-3 19:58 编辑

我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考”,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
刚刚看到一个C语言板块的帖子,感到用python很容易做,大家试试:
http://bbs.fishc.com/thread-102904-1-1.html
给定一个5*5的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。
例如:在下面的例子中(第4行第1列的元素就是鞍点,值为8 )。
11 3 5 6 9
12 4 7 8 10
10 5 6 9 11
8 6 4 7 2
15 10 11 20 25

为方便大家直接把这个矩阵写成列表了。
  1. list1= [[11,  3,  5,  6,  9],
  2.         [12,  4,  7,  8, 10],
  3.         [10,  5,  6,  9, 11],
  4.         [ 8,  6,  4,  7,  2],
  5.         [15, 10, 11, 20, 25]]
复制代码

最后输出:
第4行,第1列,值为8
即从1开始计数。

题目很简单,就不要用numpy等模块来做了。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2018-1-13 19:10:19 From FishC Mobile | 显示全部楼层
本帖最后由 shigure_takimi 于 2018-1-13 19:41 编辑
  1. list1= [[11,3,5,6,9],
  2.         [12,4,7,8,10],
  3.         [10,5,6,9,11],
  4.         [8,6,4,7,2],
  5.         [15,10,11,20,25]]

  6. for i in range(5):
  7.         a = max(list1[i])
  8.         index = list1[i].index(a)
  9.         b = [list1[j][index] for j in range(5)]
  10.         if a == min(b):
  11.                 print('鞍点: list1[{0}][{1}] -->  {2}'.format(i, index, a))
  12.                 break
  13. else:
  14.         print('没有鞍点。')

  15. #  鞍点: list1[3][0] -->  8
  16. #  手机上写的,粘贴过来对齐可能有问题。
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-1-13 21:28:37 | 显示全部楼层
不熟鞍点,题目说只有一个最大值一个最小值,那鞍点只能有一个或者没有?
找出每行最大值,求索引,然后求该列最小是否等于此最大值
  1. def fun(lst):
  2.     for i in range(len(lst)):
  3.         j = lst[i].index(max(lst[i]))
  4.         if min(row[j] for row in lst) == max(lst[i]):
  5.             return "第{}行,第{}列,值{}".format(i+1, j+1, lst[i][j])
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-1-13 22:49:21 | 显示全部楼层

  1. '''
  2. 可能有的矩阵存在不止一个鞍点
  3. 要查出所有鞍点, 并避免重复计算
  4. 1. 获取所有行的最大值, 并记录最大值的坐标
  5. 2. 获取所有列的最小值, 并记录最小值的坐标
  6. 3. 比较获取到的信息, 得出鞍点
  7. '''

  8. def fun(mlist):
  9.     mmax = []
  10.     mmin = []

  11.     for y in range(len(mlist)):
  12.         t = mlist[y]
  13.         _max = max( t )
  14.         for x in range(len(t)):
  15.             if _max == mlist[y][x]:
  16.                 mmax.append([_max,y,x])
  17.     for x in range(len(mlist[0])):
  18.         _min = mlist[0][x]
  19.         for y in range(len(mlist)):
  20.             if _min > mlist[y][x]:
  21.                 _min = mlist[y][x]
  22.         for y in range(len(mlist)):
  23.             if _min == mlist[y][x]:
  24.                 mmin.append([_min,y,x])

  25.     res = [x for x in mmax if x in mmin]
  26.     if res == []:
  27.         print("没有答案")
  28.     else:
  29.         for x in res:
  30.             print("第{}行,第{}列,值为{}".format(x[1]+1,x[2]+1,x[0]))
  31.    
  32.         

  33. def main():
  34.     mlist = [[11,  3,  5,  6,  9],
  35.             [12,  4,  7,  8, 10],
  36.             [10,  5,  6,  9, 11],
  37.             [ 8,  6,  4,  7,  2],
  38.             [15, 10, 11, 20, 25]]
  39.     fun(mlist)

  40. if __name__ == "__main__":
  41.     main()
复制代码


答案:
  1. 第4行,第1列,值为8
复制代码

测试多鞍点也是可行的

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-1-13 23:14:13 | 显示全部楼层
  1. if __name__ == '__main__':
  2.        
  3.         list1 = [[11,3,5,6,9],
  4.                 [12,4,7,8,10],
  5.                 [10,5,6,9,11],
  6.                 [8,6,4,7,2],
  7.                 [15,10,11,20,25]]

  8.         t = flag = 0

  9.         for r in range(5):
  10.                 r_max = list1[r][0]
  11.                 t = 0
  12.                 for i in range(1,5):
  13.                         if list1[r][i] > r_max:
  14.                                 r_max = list1[r][i]
  15.                                 t = i
  16.                 flag = 1
  17.                 for j in range(5):
  18.                         if r_max > list1[j][t] and flag:
  19.                                 flag = 0

  20.                 if flag:
  21.                         print("{0} {1} {2}".format(r+1, t+1, r_max))
复制代码

改头换脸型

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-1-13 23:28:34 | 显示全部楼层
本帖最后由 8306最硬 于 2018-1-14 13:22 编辑
  1. def fun(lst):
  2.     row_max = [max(x) for x in lst]
  3.     col_min = [min(x) for x in map(list, zip( *lst ))]
  4.     rs = list( set(row_max) & set(col_min) )

  5.     if rs:
  6.         row = row_max.index(rs[0])
  7.         col = col_min.index(rs[0])

  8.         return '第{}行,第{}列,值为{}'.format(row + 1, col + 1, rs[0])
  9.     else:
  10.         return '没有鞍点'
复制代码

简...简单

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-1-14 11:27:02 From FishC Mobile | 显示全部楼层
  1. list1 = [[11,3,5,6,9],[12,4,7,8,10],[10,5,6,9,11],[8,6,4,7,2],[15,10,11,20,25]]
  2. print([max(r) for r in list1 if min(i[r.index(max(r))] for i in list1)==max(r)])
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-1-14 12:18:56 | 显示全部楼层
  1. list= [[11,  3,  5,  6,  9],
  2.         [12,  4,  7,  8, 10],
  3.         [10,  5,  6,  9, 11],
  4.         [ 8,  6,  4,  7,  2],
  5.         [15, 10, 11, 20, 25]]
  6. minCol = list[0]#每列最小值
  7. for i in range(0,len(list)):
  8.         arry = []
  9.         for j in range(0,len(list[i])):
  10.                 arry.append(list[j][i])
  11.         minCol[i] = min(arry)
  12. x,y = (0,0)
  13. for ix,it in enumerate(list):
  14.         #找出该行最大值
  15.         maxIx,maxIt = (0,0)
  16.         for jx,jt in enumerate(it):
  17.                 if jt >= maxIt:
  18.                         maxIt = jt
  19.                         maxIx = jx
  20.                         #判断该值是否为该列最小值
  21.                         if jt == minCol[jx]:
  22.                                 x,y = (jx+1,ix+1)
  23. print('{0}列 , {1}行'.format(x,y))
复制代码

我写了个假python 存粹是java的语法翻译过来的
写java惯了 python遍历的索引可真是个麻烦

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-1-14 13:45:39 | 显示全部楼层
  1. list1 = [[11,  3,  5,  6,  9],
  2.         [12,  4,  7,  8, 10],
  3.         [10,  5,  6,  9, 11],
  4.         [ 8,  6,  4,  7,  2],
  5.         [15, 10, 11, 20, 25]]
  6. row_all= len(list1)
  7. col_all = len(list1[0])
  8. row_max = []
  9. row_max_index = []
  10. for row in range(0,row_all):
  11.         _max = list1[row][0]
  12.         _max_index = 0
  13.         for col in range(0,col_all):
  14.                 if list1[row][col] > _max:
  15.                         _max = list1[row][col]
  16.                         _max_index = col
  17.         row_max.append(_max)
  18.         row_max_index.append(_max_index)
  19. print(row_max)
  20. print(row_max_index)
  21. for i in range(0,row_all):
  22.         count = 0
  23.         for j in range(0,row_all):
  24.                 if row_max[i] > list1[j][row_max_index[i]] :
  25.                         break
  26.                 else:
  27.                         count += 1
  28.         if count == 5:
  29.                 print('第%d行,第%d列,值为%d是鞍点'%(i+1,row_max_index[i]+1,row_max[i]))
  30.                 break
复制代码

result

result

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-1-14 15:09:26 | 显示全部楼层
  1. #每日一题
  2. list1= [[11,  3,  5,  6,  9],
  3.         [12,  4,  7,  8, 10],
  4.         [10,  5,  6,  9, 11],
  5.         [ 8,  6,  4,  7,  2],
  6.         [15, 10, 11, 20, 25]]
  7. sign = 0
  8. for i in range (0,5):
  9.         num1 = max (list1[i])
  10.         j=list1[i].index(num1)
  11.         list2= []
  12.         for k in range(0,5):
  13.                 list2.append(list1[k][j])
  14.         num2 = min(list2)
  15.         if num1 == num2:
  16.                 print("第%d行,第%d列,值为%d" %(i+1,j+1,num2))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-1-14 19:02:37 | 显示全部楼层
import numpy as np

list1= [[11,  3,  5,  6,  9],
        [12,  4,  7,  8, 10],
        [10,  5,  6,  9, 11],
        [ 8,  6,  4,  7,  2],
        [15, 10, 11, 20, 25]]
        
def Max_rowMin_col():
    list2=np.array(list1)
    num=[]
    num1=[]
    for i in list2:
        num.append(max(i))
    for j in range(0,len(list2[:,])):
        num1.append(min(list2[:,j]))
    for x in num:
        for y in num1:
            if x==y:
                q=int(num.index(x))
                w=int(num1.index(y))
                print(x,"行数",q+1,"列数",w+1)

   
      
   
Max_rowMin_col()

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-1-14 19:24:41 | 显示全部楼层
本帖最后由 h20060304 于 2018-1-15 00:35 编辑

抱歉,由于发现逻辑本身错误,暂时删除,待更新!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-14 19:26:41 | 显示全部楼层
本帖最后由 h20060304 于 2018-1-15 13:29 编辑

抱歉,由于发现逻辑本身错误,暂时删除,待更新!

现以更新代码如下:

  1. list1 = [[11, 3, 5, 6, 9],
  2.          [12, 4, 7, 8, 10],
  3.          [10, 5, 6, 9, 11],
  4.          [8, 6, 4, 7, 2],
  5.          [15, 10, 11, 20, 25]]

  6. for r in range(len(list1)):
  7.     c = list1[r].index(max(list1[r]))
  8.     k = 0
  9.     while k < len(list1):
  10.         if list1[r][c] <= list1[k][c]:
  11.             k += 1
  12.             if k == len(list1):
  13.                 print('鞍点在第{}行,第{}列,值为:{}'.format(r + 1, c + 1, list1[r][c]))
  14.         else:
  15.             break
复制代码

360截图1637062968117101.jpg

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-1-14 20:18:16 | 显示全部楼层
怎么做呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-14 22:14:26 | 显示全部楼层
  1. def get_saddle_point(ls):
  2.     row = [[] for each in ls]
  3.     for i in range(len(ls)):
  4.         for each in ls:
  5.             row[i].append(each[i])
  6.     min_num = [[min(each), each.index(min(each))] for each in row]
  7.     for (num, index) in min_num:
  8.         if max(ls[index]) == num:
  9.             return [num, [index, ls[index].index(num)]]

  10. ls = [[11,  3,  5,  6,  9],
  11.         [12,  4,  7,  8, 10],
  12.         [10,  5,  6,  9, 11],
  13.         [ 8,  6,  4,  7,  2],
  14.         [15, 10, 11, 20, 25]]

  15. saddle_point = get_saddle_point(ls)
  16. print('鞍点为:%d, 坐标为:第%d行,第%d列。'%(saddle_point[0], saddle_point[1][0]+1, saddle_point[1][1]+1))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-1-14 22:22:19 | 显示全部楼层
list1= [[11,  3,  5,  6,  9],
        [12,  4,  7,  8, 10],
        [10,  5,  6,  9, 11],
        [ 8,  6,  4,  7,  2],
        [15, 10, 11, 20, 25]]
numlist=[]
for each in list1:
    max_num=max(each)
    max_addr=each.index(max_num)
    for each in list1:
        numlist.append(each[max_addr])
        min_num=min(numlist)
        min_addr=numlist.index(min_num)

    if max_num == min_num:
            print('第%d行,第%d列,值为%d'%(max_addr+1,min_addr+1,max_num))
            print('即从1开始计数')
    numlist=[]

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-1-15 10:28:24 | 显示全部楼层
本帖最后由 graceasyi 于 2018-1-15 10:42 编辑

list1= [[11,  3,  5,  6,  9],
        [12,  4,  7,  8, 10],
        [10,  5,  6,  9, 11],
        [ 8,  6,  4,  7,  2],
        [15, 10, 11, 20, 25]]

l1=[]        # 保存最大值及其索引
for i in list1:
        r=list1.index(i)
        c=list1[r].index(max(i))
        l1.append([max(i), r, c])

l2=[]        # 保存最小值及其索引       
for c in range(len(list1[0])):
        tmp=[]
        for r in range(len(list1)):
                tmp.append(list1[r][c])
        l2.append([min(tmp), tmp.index(min(tmp)), c])

result = [i for i in l1 if i in l2]        # 求交集
if result:
    print("鞍点为:" + "第" + str(result[0][1]) + "行," + "第" + str(result[0][2]) + "列," + "值为" + str(result[0][0]))
else:
    print("没有这样的点。")

【输出结果】
鞍点为:第3行,第0列,值为8

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-1-15 10:30:35 | 显示全部楼层
graceasyi 发表于 2018-1-15 10:28
list1= [[11,  3,  5,  6,  9],
        [12,  4,  7,  8, 10],
        [10,  5,  6,  9, 11],

行列是按数组下标从0开始输出的,要输出4行1列加1即可,这里就不改了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-15 11:33:48 | 显示全部楼层
  1. list1= [[11,  3,  5,  6,  9],
  2.         [12,  4,  7,  8, 10],
  3.         [10,  5,  6,  9, 11],
  4.         [ 8,  6,  4,  7,  2],
  5.         [15, 10, 11, 20, 25]]

  6. for i in range(5):
  7.     temp = list1[i][0]
  8.     row = i
  9.     col = 0
  10.     flag=1
  11.    
  12.     for j in range(5):
  13.         if list1[i][j]>temp:
  14.             temp = list1[i][j]
  15.             col = j
  16.    
  17.     for each in range(5):
  18.         if list1[each][col]<temp:
  19.             flag = 0
  20.             
  21.     if flag:
  22.         print ('%d row, %d column, value: %d' %(row+1, col+1, list1[row][col]))
  23.      
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2018-1-15 19:51:32 | 显示全部楼层
list1= [[11,  3,  5,  6,  9],
        [12,  4,  7,  8, 10],
        [10,  5,  6,  9, 11],
        [ 8,  6,  4,  7,  2],
        [15, 10, 11, 20, 25]]

list2=[]
listpass=[]
for l in range(0,5):
        listpass=[]
        for h in range(0,5):
                listpass.append(list1[h][l])
        list2.append(listpass)
#print(list2)

for i in range(0,5):
        for j in range(0,5):
                if list1[i][j] == max(list1[i]) == min(list2[j]):
                        print(list1[i][j],i,j)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-28 20:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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