2014-08-28 79 views
0

我想編寫一個程序來確定聲音樣本的最大值。循環返回所有樣本的值,但我無法弄清楚如何打印最大的樣本。最大()函數使用從循環python

def largest(): 
f=pickAFile() 
sound=makeSound(f) 
for i in range(1,getLength(sound)): 
    value=getSampleValueAt(sound,i) 
print max([value]) 
+0

請修復您的縮進。 – chepner 2014-08-28 14:21:59

回答

3

嘗試:

def largest(): 
    f = pickAFile() 
    sound = makeSound(f) 
    value = [] 
    for i in range(1, getLength(sound)): 
     value.append(getSampleValueAt(sound, i)) 
    print max(value) 

或者

def largest(): 
    f = pickAFile() 
    sound = makeSound(f) 
    print max(getSampleValueAt(sound, i) for i in range(1, getLength(sound))) 

與您的代碼,value在每次迭代將被覆蓋。如果您使用所有值創建列表,則可以使用max找到最大值。

另見:

+0

這是有效的,但我也試圖計算現在正在檢索線程死亡的示例中「0」的出現次數。 value.count(「0」)是一個可行的爲什麼要這樣做? – ddbg 2014-08-28 14:30:11

+0

它應該是,但不是整數值,所以你需要'value.count(0)'? – matsjoyce 2014-08-28 14:32:04

0

沒有測試它,但也許:

def largest(): 
f=pickAFile() 
sound=makeSound(f) 
value = [ getSampleValueAt(sound,i) for i in range(1,getLength(sound)) ] 
print max(value) 
+0

如果你有幾個Msamples呢? – 2014-08-28 14:23:03

+0

@Sylvain Leroux那麼我將不得不改變它,但這應該是對主題提供的代碼的修復 – Vizjerei 2014-08-28 14:51:58

1

不記得我們在處理音頻數據。可能有百萬的樣本。如果你想堅持高效兩個東西在空間和時間,你必須依靠遠不如性感:

def largest(): 
    f = pickAFile() 
    sound = makeSound(f) 
    max = getSampleValueAt(sound, 1) # FIX ME: exception (?) if no data 
    idx = 2 
    while idx < getLength(sound): 
     v = getSampleValueAt(sound, i) 
     if v > max: 
      max = v 
     i += 1 

    print max 

發電的解決方案是有效的太的空間內,但速度快,無可以擊敗Python中一個普通的命令循環。