2016-03-07 11 views
12

sayı matrisi içinde maksimal değerini bulmak için, sorunu çözmek için 5 satırları kodu olabilir? Ben ile geldi biri aslında oldukça garip:Matriste maksimum değeri bulmak için tek bir satır kodu var mı?</p> <pre><code>ans = matrix[0][0] for x in range(len(matrix)): for y in range(len(matrix[0])): ans = max(ans, matrix[x][y]) return ans </code></pre> <p>bu sorun için bir tek satır çözüm var mı:

return max(max(matrix, key=max)) 

veya Matris ile

return max(map(max, matrix)) 
+0

Neden 'anahtar = max'' max' işlevine? Bu mantıklı değil. Ama aksi halde, bu çalışır, bu yüzden kendi sorunuzu zaten yanıtladı. Bunu sıklıkla veya büyük matrislerle yapacaksanız, numpy'yi de kullanabilirsiniz. – Evert

+0

@Evert 'anahtar = max' in' max' işlevi, her satır için karşılaştırmak için o satırın maksimum değerini kullanır. – 8090PZ

+1

Tek bir satıra çok fazla mantık koymanın, kodunuzun okunmasını zor bir hale getirmenin harika bir yolu olduğunu unutmayın. –

cevap

14

Sen matris içinde maksimum bulmak için generator expression kullanabilirsiniz. Bu şekilde, bellekte matris öğelerinin tam listesini oluşturmadan önleyebilirsiniz. Bir önceki yanıt verildiği şekilde yerine liste anlama

maximum = max(max(row) for row in matrix) 

here

maximum = max([max(row) for row in matrix]) 

Bu PEP kaynaklıdır (rationale bölümü):

... kullanım durumları çok yapmak belleğinde oluşturulan tam bir listeye sahip olmanız gerekmiyor. Bunun yerine, yalnızca bir elemanın üzerinde bir zamanında yinelemelidir.

...

Jeneratör ifadeleri tek bir değer

...

bir iterable girdisini azaltmak toplamı(), dk() ve max (gibi fonksiyonlar) ile özellikle faydalıdır

Jeneratör ifadelerinin kullanımı, sum(), min() ve max() gibi küçültme işlevleri ile birleştirildiğinde büyük ölçüde geliştirilmiştir.

Ayrıca, bu SO gönderine bir bakın: Generator Expressions vs. List Comprehension.

8

, sana 2d-liste demek varsayalım. numpy.amax kullanarak

max([max(i) for i in matrix]) 
+21

Gerçekten bir ara liste oluşturmanıza gerek yoktur, örn .: 'max (matris içinde i için maks (i)') - bir jeneratör ifadesi yeterince iyi. – AChampion

+0

@AChampion daha önce bahsedildiği gibi, bu durumda jeneratör ifadesini kullanmak daha iyidir.Bir bakın [burada] (https://www.python.org/dev/peps/pep-0289/) ve [işte] (https://www.python.org/dev/peps/pep-0289/ # küçültme işlevleri) –

5

:

import numpy as np 
>>> my_array 
array([[1, 2, 3], 
     [9, 8, 6]]) 
>>> np.amax(my_array) 
9 
+0

Sorunun amacı OP'nin verileri sayısal bir dizide içermemesidir. En azından bir numpy çözümü kullanarak yanıtlamayı planlıyorsanız, python listesinden numpy dizisine dönüştürme işlemini gerçekleştirmek için kodu da eklemeniz gerekir. – Bakuriu

+0

@Bakuriu Aslında, şu anki formunda bu cevap gösterilmese de, tüm alt listelerin aynı uzunluğa sahip olması durumunda Numpy bir liste halinde bir dizi halinde çalışacaktır. (Muhtemelen OP'in bir matris olarak adlandırdığı için durum böyledir.) Demek ki, Numpy'yi kullanmak için bir nedeniniz yoksa, büyük bir bağımlılıktır. işlevi. –

5

Ayrıca dizi dümdüz:

from itertools import chain 

flatten = chain.from_iterable 

max(flatten(matrix)) 
İlgili konular