使用Python查找矩阵中的最小值(不使用内置的min函数)
给定以下矩阵:使用Python查找矩阵中的最小值(不使用内置的min函数),python,algorithm,python-3.x,matrix,Python,Algorithm,Python 3.x,Matrix,给定以下矩阵: matrix = { "A": ['-' , 6 , '-' , 4 , '-' , '-' ], "B": [6 , '-' , 1 , 3 , 8 , 2 ], "C": ['-' , 1 , '-' , '-' , '-' , 3 ], "D": [4 , 3 , '-' , '-' , 4 , '-' ], "E": ['-' , 8 , '-' , 4 , '-' , 4
matrix = {
"A": ['-' , 6 , '-' , 4 , '-' , '-' ],
"B": [6 , '-' , 1 , 3 , 8 , 2 ],
"C": ['-' , 1 , '-' , '-' , '-' , 3 ],
"D": [4 , 3 , '-' , '-' , 4 , '-' ],
"E": ['-' , 8 , '-' , 4 , '-' , 4 ],
"F": ['-' , 2 , 3 , 4 , 4 , '-' ]
}
如何找到最小值
我想使用除min()
函数以外的其他函数
使用可以转换到其他语言的东西。记住这是一本
字典,而不是矩阵。循环遍历每个值,并始终保存最小值
dict = {"A": ['-' , 6 , '-' , 4 , '-' , '-' ],
"B": [6 , '-' , 1 , 3 , 8 , 2 ],
"C": ['-' , 1 , '-' , '-' , '-' , 3 ],
"D": [4 , 3 , '-' , '-' , 4 , '-' ],
"E": ['-' , 8 , '-' , 4 , '-' , 4 ],
"F": ['-' , 2 , 3 , 4 , 4 , '-' ]
}
min = 1337133713371337
for i in dict.values():
for m in i:
if m < min:
min = m
print min
dict={“A”:['-',6'-',4'-','-','-'],
“B”:[6',-',1,3,8,2],
“C”:['-',1'-','-','-','-',3],
“D”:[4,3'-','-',4'-',
“E”:['-',8'-',4'-',4],
“F”:['-',2,3,4,4'-']
}
最小值=13371371337
对于dict.values()中的i:
对于i中的m:
如果m
matrix['A'][0]#这是最小的值
for each in matrix:
matrix[each].short()
matrix[each][0]
这是一个Python 2解决方案(不适用于Python 3):
d=[]
对于矩阵中的x.values():
d、 扩展(x)
d=列表(过滤器(λx:isinstance(x,int),d))
最小=d[0]
d系硕士:
如果m
这里有一行代码:
from itertools import chain
print sorted(filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(matrix.values())))[0]
发生了什么事
正如已经指出的,你有字典,而不是矩阵;使用matrix.values()
可以访问的值。然后使用itertools.chain
,过滤出所有数字,对数字进行排序并打印第一个数字,将结果列表展平
如果要避免排序,还可以执行以下操作:
from itertools import chain
newL = filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(matrix.values()))
# [6, 4, 1, 3, 6, 1, 3, 8, 2, 8, 4, 4, 4, 3, 4, 2, 3, 4, 4]
minVal = newL[0]
for val in newL:
if val < minVal:
minVal = val
来自itertools导入链的
newL=filter(lambda x:isinstance(x,(int,long,float)),chain.from_iterable(matrix.values())
# [6, 4, 1, 3, 6, 1, 3, 8, 2, 8, 4, 4, 4, 3, 4, 2, 3, 4, 4]
minVal=newL[0]
对于newL中的val:
如果val
或者,如果您有numpy:
# your dictionary
In [128]: matrix
Out[128]:
{'A': ['-', 6, '-', 4, '-', '-'],
'B': [6, '-', 1, 3, 8, 2],
'C': ['-', 1, '-', '-', '-', 3],
'D': [4, 3, '-', '-', 4, '-'],
'E': ['-', 8, '-', 4, '-', 4],
'F': ['-', 2, 3, 4, 4, '-']}
In [129]: import numpy as np
In [130]: m = np.array(list(matrix.values()))
In [131]: m
Out[131]:
array([['-', '6', '-', '4', '-', '-'],
['4', '3', '-', '-', '4', '-'],
['-', '2', '3', '4', '4', '-'],
['-', '8', '-', '4', '-', '4'],
['-', '1', '-', '-', '-', '3'],
['6', '-', '1', '3', '8', '2']],
dtype='<U1')
# masking out '-' elements and find the min for their int type values
In [132]: m[np.where(m != '-')].astype(int).min()
Out[132]: 1
#你的字典
In[128]:矩阵
出[128]:
{'A':['-',6'-',4'-','-','-'],
"B":[6,1,3,8,2],,
"C":["一","一","一","一","三",,
‘D’:[4,3',-','-',4',-',],
"E":[",8","4","4",,
‘F’:['-',2,3,4,4'-']}
在[129]中:将numpy作为np导入
在[130]中:m=np.array(list(matrix.values())
In[131]:m
出[131]:
数组(['-'、'6'、'-'、'4'、'-'、'-'、'-'],
['4', '3', '-', '-', '4', '-'],
['-', '2', '3', '4', '4', '-'],
['-', '8', '-', '4', '-', '4'],
['-', '1', '-', '-', '-', '3'],
['6', '-', '1', '3', '8', '2']],
dtype='这是一个字典
,而不是矩阵
循环所有值,跟踪最小的数字,并在每次发现一个新的、更小的数字时更新它。其他语言也有min。用一种语言编写的任何内容都必须适应另一种语言。更明确地说:如果编写python p使用min编程,你可以将它翻译成其他语言;如果你编写一个没有min的python程序,它仍然需要翻译成“转移到其他语言”(不管这意味着什么)。我能想到的不使用min的唯一原因是如果你的作业说“不要使用min”@Teepeemm-hmm-fair。原因是我不想学习特定于python的东西,而是想学习如何操作的机制。我认为“转移到其他语言”部分有点猜测了这一点,但不管怎样。@baxx:还有什么遗漏吗?如果需要进一步解释,请告诉我!如果“矩阵”包含只有大于100000000
?我们可以继续这样做;-)@TimCastelijns是的,这是我之前尝试过的一个问题。。。。我想人们可以使用sys.maxint()
(或其他任何东西),但我认为可能有更好的方法或其他方法。。。。我不确定是否需要它?@TimCastelijns有一个很好的数学论证,空列表的最小值是float('inf')
。但是比较对非数字项不起作用。那么矩阵就会乱序——这在我计划使用它的算法(prims)中是很难使用的。我还觉得sort()
可能会引入一些很难转换到其他语言的东西。干杯!当你只需要最低限度的东西时,进行排序不是很有效。除了需要复制原始数据(如果您不想弄乱其顺序),排序最多是O(nlogn)(如果您使用简单的排序算法,则为O(n²)),而通过简单循环查找最小值是O(n)。这得到的是行a
的最小值,而不是全部。由于“filter”返回列表,因此不需要“list”命令(另请参见下面我的答案)。在Python2.7
返回列表中,在Python3.x
返回生成器中。问题是关于Python3.x
哦,忽略了Python3标记;那么你是对的。你仍然在使用min()
,只是numpy版本的。
from itertools import chain
newL = filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(matrix.values()))
# [6, 4, 1, 3, 6, 1, 3, 8, 2, 8, 4, 4, 4, 3, 4, 2, 3, 4, 4]
minVal = newL[0]
for val in newL:
if val < minVal:
minVal = val
# your dictionary
In [128]: matrix
Out[128]:
{'A': ['-', 6, '-', 4, '-', '-'],
'B': [6, '-', 1, 3, 8, 2],
'C': ['-', 1, '-', '-', '-', 3],
'D': [4, 3, '-', '-', 4, '-'],
'E': ['-', 8, '-', 4, '-', 4],
'F': ['-', 2, 3, 4, 4, '-']}
In [129]: import numpy as np
In [130]: m = np.array(list(matrix.values()))
In [131]: m
Out[131]:
array([['-', '6', '-', '4', '-', '-'],
['4', '3', '-', '-', '4', '-'],
['-', '2', '3', '4', '4', '-'],
['-', '8', '-', '4', '-', '4'],
['-', '1', '-', '-', '-', '3'],
['6', '-', '1', '3', '8', '2']],
dtype='<U1')
# masking out '-' elements and find the min for their int type values
In [132]: m[np.where(m != '-')].astype(int).min()
Out[132]: 1