2015-10-30 54 views
-5

給定的矩陣:查找使用Python矩陣中的最小值(不使用內置min函數)

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()函數以外的其他函數,因爲我想用 來使用一些可以轉換爲其他語言的函數。

+5

這是一個'dictionary',不'matrix' –

+5

循環遍歷所有的值並記錄最小的數字,並在每次找到新的更小的數字時更新它 –

+0

其他語言也有最小值。你用一種語言寫的任何東西都必須適應另一種語言。更明確地說:如果您使用min編寫python程序,則可以將其翻譯爲其他語言;如果你沒有min寫一個python程序,它仍然需要翻譯成「轉移到其他語言」(不管這意味着什麼)。我能想到不使用min的唯一原因是如果你的作業說「不要使用min」。 – Teepeemm

回答

1

請記住這是一個dictionary,而不是matrix。循環遍歷每個值並保存最小值。

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 
+5

如果「矩陣」僅包含大於「100000000」的數字,該怎麼辦?我們可以繼續這樣做;-) –

+0

@TimCastelijns是的,這是我的一個問題,當我早些時候去了一次....我想可以使用'sys.maxint()'(或其他任何東西),但我認爲可能有更好的辦法或者什麼......我不確定,但也許它是需要的? – baxx

+0

@TimCastelijns有一個體面的數學論證,一個空列表的最小值是'float('inf')'。但比較不適用於非數字條目。 – Teepeemm

0
matrix['A'].sort() 

matrix['A'][0] #this is the smallest value

for each in matrix: 
    matrix[each].short() 
    matrix[each][0] 
+0

那麼矩陣會失序 - 這在使用我想要的算法時會非常棘手。另外我覺得'sort()'可能會引入一些難以轉換到其他語言的東西。乾杯壽 – baxx

+3

當你只需要最低限度做一個排序不是很有效。除了需要複製原始數據(如果您不想搞亂它的順序),排序最好是O(nlogn)(如果使用天真的排序算法,則排序爲O(n²)),而通過簡單循環找到最小值是O(n)。 –

+0

這會得到行「A」的最小值,而不是整個事物。 – Teepeemm

1

這是一個Python 2溶液(不爲Python 3工作):

d = [] 
for x in matrix.values(): 
    d.extend(x) 
d = list(filter(lambda x: isinstance(x, int), d)) 
min = d[0] 
for m in d: 
    if m < min: 
     min = m 
+0

「list」命令不是必需的,因爲「filter」返回一個列表(另請參閱下面的答案)。 – Cleb

+0

在'Python 2.7'返回列表中,在'Python 3.x'中返回生成器。問題是關於'Python 3.x' –

+0

哦,忽略了Python 3標籤;那麼你是對的。 – Cleb

1

下面是一個單行爲它:

from itertools import chain 
print sorted(filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(matrix.values())))[0] 

這是怎麼回事?

正如它已經指出,你有一個字典,而不是一個矩陣;您可以使用matrix.values()訪問的值。然後,使用itertools.chain,filter列出所有數字,將所得列表平坦化,對數字進行排序並打印第一個數字。

如果你想避免排序,你也可以做到以下幾點:

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 
0

或者如果你有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 
+0

不使用numpy,但感謝您的建議 – baxx

+0

您仍然在使用'min()',它只是numpy的版本。 – Teepeemm

相關問題