使用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