2013-03-16 33 views
2
counts = misc. array 

    for i in counts: 
     if i < "(sum of the two integers next to i)/4" 
      return -1 

我所試圖做的是設置在列表中哪些是低於平均水平的一半他們的兩個鄰國爲-1所有值。即列表[10.,20。10.,25.,30.]如果我= 3,那麼我想看看10是否小於(20 + 25)/ 4,因爲那是45/4> 10我想然後設置10等於-1。然後,我將篩選列表中的所有值> = 0使用列表中其他值的函數過濾python中的列表。

這是由事實進一步複雜化,你應該開始與我+ 1,因爲這個過程中不與第一值工作,然後你應該結束-1,因爲這個過程不適用於最後一個值。任何幫助將不勝感激。

回答

1

你可以從this answer借用滑動窗口發生器,並把它用像這樣:

out = [y if y >= (x+z)/4. else -1 for x,y,z in window(l, 3)] 

其中l是您的清單。

該砍掉的第一和最後一個元素。如果你願意,可以很容易地做一些不同的事情(例如設置爲-1)。

+0

這對那些剛剛問他第一個問題的用戶(new_user_number)有何幫助?不是說我的答案是最大的...... – catalesia 2013-03-16 19:39:38

0

這是不是你想要做什麼(假設值在列表data)?

filtered = [data[i] for i in range(1,len(data)-1) if data[i] >= (data[i+1]+data[i-1])/4] 
0

喜歡的是:

result = [(x+1 if counts[x] > counts[x-1]/counts[x+1]/4 else -1) for x in range(len(counts[1:-1]))] 

- x是在一個計數IDEX - 在範圍>對於x(LEN(計數[1:-1])
- x+1因爲我們知道計數[0]和計數[-1]出來,因此要達到的結果必須要調整它
- if count[x] > counts[x-1]/counts[x+1]/4 else -1測試,返回結果如果結果爲真,否則返回-1
注意> 0,這是相反你想要什麼
- for x in range(len(counts[1:-1]))
,因爲我們第一次知道和最後一個值是不管
- counts[1:-1]如上,總是最好使用列表的副本,線程安全

這應該工作,會給你的每指數有效(!=-1)和無效(== -1)導致數列表,

的問題是,你能對結果做進一步?

你可以測試,如:(介意調整X的結果

['N/A'] + [(x if x!= -1 else False) for x in result] + ['N/A'] 

,讓你無論使用哪種虛實結果數量的鏡像

+0

'len'是不可迭代的。 – George 2013-03-16 19:18:16

+0

是的,忘了添加範圍,現在改變 – catalesia 2013-03-16 19:21:43

+0

排序,現在它工作 – catalesia 2013-03-16 19:25:53

0

我有一個解決方案看起來不太優雅,但我相信這是正確和可以理解的。包含過濾功能,所以如果-1是允許的值,它也可以工作。

我使用3個變量(a,b和I),和3個標記變量(FA,FB和FI),其顯示如果該值需要被包括在結果集中或沒有。

def test(lst): 
    a, fa, b, fb, res = None, False, None, False, [] 
    for i in lst: 
     if a is not None: 
      fi = b < (a + i)/4 
     else: 
      fi = True 
     if fa: 
      res.append(a) 
     a, fa = b, fb 
     b, fb = i, fi 
    if fa: 
     res.append(a) 
    res.append(b) 
    return res 

print(test([10., 20., 10., 25., 30.])) 
=> [10.0, 20.0, 25.0, 30.0] 
相關問題