2013-10-31 61 views
0

我需要幫助,請求在每個索引i上使用規則A[i] = A[i] * B[i] + C[i]的數字列表(所有長度都相同)的問題。在此之後,每個A[i]如果A[i] < 0返回-1.0,否則返回1.0。評估列表的組合

到目前爲止,我有

def Vecombine(A, B, C): 
    for i in range(len(A)): 
     A[i] = A[i] * B[i] + C[i] 
     return A[i] 
    if A[i] < 0: 
     return (-1.0) 

我知道我需要以某種方式在另一個循環中添加跟蹤的正面和負面的東西最終會返回,但我只是在如何做到這一點有點困惑。我也可能會寫出這段代碼...我在嘗試,但我只是不完全理解python。

+0

我不明白退貨-1或退貨1員工,你能解釋一下好嗎? – Christian

回答

2

您可以使用列表理解或產生此

def Vecombine(a, b, c): 
    return (-1.0 if i * j + k < 0 else 1.0 for i, j, k in zip(a, b, c)) 

相關文章:

「合併」 陣列

編輯: 如果你想變異a

def Vecombine(a, b, c): 
    for i in xrange(len(a)): 
     a[i] = -1.0 if a[i] * b[i] + c[i] < 0 else 1.0 
+0

OP想要覆蓋'A' – inspectorG4dget

+1

如果他們想用列表理解來覆蓋'A',它也可以工作:'A [:] = [-1.0如果i * j + k <0否則1.0對於i,j, k in zip(a,b,c)];返回A' – SethMMorton

0
In [84]: %paste 
def Vecombine(A,B,C): 
    for i,(a,b,c) in enumerate(itertools.izip(A,B,C)): 
    A[i] = a*b + c 

## -- End pasted text -- 

In [85]: A = range(1,5) 

In [86]: B = range(5,9) 

In [87]: C = range(9,13) 

In [88]: len(A)==len(B)==len(C) 
Out[88]: True 

In [89]: A 
Out[89]: [1, 2, 3, 4] 

In [90]: Vecombine(A,B,C) 

In [91]: A 
Out[91]: [14, 22, 32, 44] 
+0

我喜歡使用'enumerate()',我需要習慣這個。但據我所知,原來的問題要求列出1.0或-1.0的列表。 – icedwater

0

我不認爲這會工作,你覺得會的方式,對於A [1],它只會從函數返回。你可以用-1.0或1.0代替A [i]的值,最後返回A,但是一旦第一個索引從函數返回,就完成了。另外,除非格式不正確,否則將始終返回A [0]。也許這就是你想要的。

def Vecombine(A,B,C): 
    l = [] 
    for i in range(len(A)): 
     A[i]=A[i] * B[i] + C[i] 
    if A[i]<0: 
     l.append(-1.0) 
    else: 
     l.append(1.0) 
    return l 

在函數結束時,升將具有[-1.0,-1.0,1.0,1.0,等...]

+0

我不確定這是OP實際需要的,因爲在數組的最後一個元素上檢查'if A [i] <0:'只執行一次,*循環完成後。它相當於'如果A [-1] <0:'如果這實際上是OP所需要的,那麼應該通過用'-1'替換'i'來明確它。 – SethMMorton

+0

乍看之下,它看起來像'if'語句要放在* for'循環中。 – SethMMorton

+0

當我把'if'語句放在'for'循環中時,在我的程序中會導致多次失敗。除了'(A,B,C)= [1,2,3],[1,1,1],[ - 10,-20,-30]'它應該返回'-1.0'它返回'1.0'我是否需要添加新的循環,以便檢查多次執行? – user2847983

0

靈感來自inspectorG4dget

from itertools import izip 
from math import copysign 

def Vecombine(A, B, C): 
""" Assuming A, B, C are lists of same length, process them and return 
    1.0 if the result is positive or -1.0 if the result is negative. """ 
    for i, (a, b, c) in enumerate(izip(A, B, C)): 
     A[i] = a * b + c 
    S = [copysign(1, el) for el in A] 
    return (A, S) 

我保存的它在test.py。然後用以下值對其進行測試:

from test import Vecombine 

a = [1, 3, 5, 7] 
b = [-1, -1, 1, 1] 
c = [0, 0, 0, 0] 

print "a = ", a 
print "b = ", b 
print "c = ", c 

(ans, sign) = Vecombine(a, b, c) 

print "Answers: ", ans 
print "Signs: ", sign 

這會用計算結果覆蓋原始數組。 S然後保留A中對應值的符號,即,對於正值爲1.0,對於使用copysign的負值爲-1.0。

**但是,它似乎覆蓋了每次運行a的值。這將需要解決。