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: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
#手机上写的,粘贴过来对齐可能有问题。 不熟鞍点,题目说只有一个最大值一个最小值,那鞍点只能有一个或者没有?{: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)
'''
可能有的矩阵存在不止一个鞍点
要查出所有鞍点, 并避免重复计算
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
测试多鞍点也是可行的 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-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:} list1 = [,,,,]
print( for i in list1)==max(r)]) 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遍历的索引可真是个麻烦
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
#每日一题
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)) 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-15 00:35 编辑
抱歉,由于发现逻辑本身错误,暂时删除,待更新!{:10_266:} 本帖最后由 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
怎么做呢 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)) 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: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:28
list1= [,
,
,
行列是按数组下标从0开始输出的,要输出4行1列加1即可,这里就不改了。 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))
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