冬雪雪冬 发表于 2018-1-13 18:32:30

Python:每日一题 141

本帖最后由 冬雪雪冬 于 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

为方便大家直接把这个矩阵写成列表了。
list1= [,
      ,
      ,
      [ 8,6,4,7,2],
      ]
最后输出:
第4行,第1列,值为8
即从1开始计数。

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

shigure_takimi 发表于 2018-1-13 19:10:19

本帖最后由 shigure_takimi 于 2018-1-13 19:41 编辑

list1= [,
      ,
        ,
        ,
        ]

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

#鞍点: list1 -->8
#手机上写的,粘贴过来对齐可能有问题。

solomonxian 发表于 2018-1-13 21:28:37

不熟鞍点,题目说只有一个最大值一个最小值,那鞍点只能有一个或者没有?{:9_241:}
找出每行最大值,求索引,然后求该列最小是否等于此最大值
def fun(lst):
    for i in range(len(lst)):
      j = lst.index(max(lst))
      if min(row for row in lst) == max(lst):
            return "第{}行,第{}列,值{}".format(i+1, j+1, lst)

久疤K 发表于 2018-1-13 22:49:21


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

def fun(mlist):
    mmax = []
    mmin = []

    for y in range(len(mlist)):
      t = mlist
      _max = max( t )
      for x in range(len(t)):
            if _max == mlist:
                mmax.append()
    for x in range(len(mlist)):
      _min = mlist
      for y in range(len(mlist)):
            if _min > mlist:
                _min = mlist
      for y in range(len(mlist)):
            if _min == mlist:
                mmin.append()

    res =
    if res == []:
      print("没有答案")
    else:
      for x in res:
            print("第{}行,第{}列,值为{}".format(x+1,x+1,x))
   
      

def main():
    mlist = [,
            ,
            ,
            [ 8,6,4,7,2],
            ]
    fun(mlist)

if __name__ == "__main__":
    main()


答案:
第4行,第1列,值为8
测试多鞍点也是可行的

水冢 发表于 2018-1-13 23:14:13

if __name__ == '__main__':
       
        list1 = [,
                ,
                ,
                ,
                ]

        t = flag = 0

        for r in range(5):
                r_max = list1
                t = 0
                for i in range(1,5):
                        if list1 > r_max:
                                r_max = list1
                                t = i
                flag = 1
                for j in range(5):
                        if r_max > list1 and flag:
                                flag = 0

                if flag:
                        print("{0} {1} {2}".format(r+1, t+1, r_max))
改头换脸型

8306最硬 发表于 2018-1-13 23:28:34

本帖最后由 8306最硬 于 2018-1-14 13:22 编辑

def fun(lst):
    row_max =
    col_min =
    rs = list( set(row_max) & set(col_min) )

    if rs:
      row = row_max.index(rs)
      col = col_min.index(rs)

      return '第{}行,第{}列,值为{}'.format(row + 1, col + 1, rs)
    else:
      return '没有鞍点'

简...简单{:10_284:}

jerryxjr1220 发表于 2018-1-14 11:27:02

list1 = [,,,,]
print( for i in list1)==max(r)])

cnkizy 发表于 2018-1-14 12:18:56

list= [,
      ,
      ,
      [ 8,6,4,7,2],
      ]
minCol = list#每列最小值
for i in range(0,len(list)):
        arry = []
        for j in range(0,len(list)):
                arry.append(list)
        minCol = min(arry)
x,y = (0,0)
for ix,it in enumerate(list):
        #找出该行最大值
        maxIx,maxIt = (0,0)
        for jx,jt in enumerate(it):
                if jt >= maxIt:
                        maxIt = jt
                        maxIx = jx
                        #判断该值是否为该列最小值
                        if jt == minCol:
                                x,y = (jx+1,ix+1)
print('{0}列 , {1}行'.format(x,y))

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

haixiaotian 发表于 2018-1-14 13:45:39

list1 = [,
      ,
      ,
      [ 8,6,4,7,2],
      ]
row_all= len(list1)
col_all = len(list1)
row_max = []
row_max_index = []
for row in range(0,row_all):
        _max = list1
        _max_index = 0
        for col in range(0,col_all):
                if list1 > _max:
                        _max = list1
                        _max_index = col
        row_max.append(_max)
        row_max_index.append(_max_index)
print(row_max)
print(row_max_index)
for i in range(0,row_all):
        count = 0
        for j in range(0,row_all):
                if row_max > list1] :
                        break
                else:
                        count += 1
        if count == 5:
                print('第%d行,第%d列,值为%d是鞍点'%(i+1,row_max_index+1,row_max))
                break

coopr 发表于 2018-1-14 15:09:26

#每日一题
list1= [,
      ,
      ,
      [ 8,6,4,7,2],
      ]
sign = 0
for i in range (0,5):
        num1 = max (list1)
        j=list1.index(num1)
        list2= []
        for k in range(0,5):
                list2.append(list1)
        num2 = min(list2)
        if num1 == num2:
                print("第%d行,第%d列,值为%d" %(i+1,j+1,num2))

wojiaodabai 发表于 2018-1-14 19:02:37

import numpy as np

list1= [,
      ,
      ,
      [ 8,6,4,7,2],
      ]
      
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()

h20060304 发表于 2018-1-14 19:24:41

本帖最后由 h20060304 于 2018-1-15 00:35 编辑

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

h20060304 发表于 2018-1-14 19:26:41

本帖最后由 h20060304 于 2018-1-15 13:29 编辑

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

现以更新代码如下:

list1 = [,
         ,
         ,
         ,
         ]

for r in range(len(list1)):
    c = list1.index(max(list1))
    k = 0
    while k < len(list1):
      if list1 <= list1:
            k += 1
            if k == len(list1):
                print('鞍点在第{}行,第{}列,值为:{}'.format(r + 1, c + 1, list1))
      else:
            break

愤怒的蜗牛 发表于 2018-1-14 20:18:16

怎么做呢

wyp02033 发表于 2018-1-14 22:14:26

def get_saddle_point(ls):
    row = [[] for each in ls]
    for i in range(len(ls)):
      for each in ls:
            row.append(each)
    min_num = [ for each in row]
    for (num, index) in min_num:
      if max(ls) == num:
            return .index(num)]]

ls = [,
      ,
      ,
      [ 8,6,4,7,2],
      ]

saddle_point = get_saddle_point(ls)
print('鞍点为:%d, 坐标为:第%d行,第%d列。'%(saddle_point, saddle_point+1, saddle_point+1))

Nina_cll 发表于 2018-1-14 22:22:19

list1= [,
      ,
      ,
      [ 8,6,4,7,2],
      ]
numlist=[]
for each in list1:
    max_num=max(each)
    max_addr=each.index(max_num)
    for each in list1:
      numlist.append(each)
      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=[]

graceasyi 发表于 2018-1-15 10:28:24

本帖最后由 graceasyi 于 2018-1-15 10:42 编辑

list1= [,
      ,
      ,
      [ 8,6,4,7,2],
      ]

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

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

result =         # 求交集
if result:
    print("鞍点为:" + "第" + str(result) + "行," + "第" + str(result) + "列," + "值为" + str(result))
else:
    print("没有这样的点。")

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

graceasyi 发表于 2018-1-15 10:30:35

graceasyi 发表于 2018-1-15 10:28
list1= [,
      ,
      ,


行列是按数组下标从0开始输出的,要输出4行1列加1即可,这里就不改了。

^v^『笨Oo蛋O』 发表于 2018-1-15 11:33:48

list1= [,
      ,
      ,
      [ 8,6,4,7,2],
      ]

for i in range(5):
    temp = list1
    row = i
    col = 0
    flag=1
   
    for j in range(5):
      if list1>temp:
            temp = list1
            col = j
   
    for each in range(5):
      if list1<temp:
            flag = 0
            
    if flag:
      print ('%d row, %d column, value: %d' %(row+1, col+1, list1))
   

大头目 发表于 2018-1-15 19:51:32

list1= [,
      ,
      ,
      [ 8,6,4,7,2],
      ]

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

for i in range(0,5):
      for j in range(0,5):
                if list1 == max(list1) == min(list2):
                        print(list1,i,j)
页: [1] 2
查看完整版本: Python:每日一题 141