繁体   English   中英

评估列表的组合

[英]Evaluating a combination of lists

我需要帮助解决在每个索引i处使用规则A[i] = A[i] * B[i] + C[i]的问题列表(所有这些都是相同的长度)的问题。 在此之后,如果A[i] < 0 ,则每个A[i]返回-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。

您可以使用列表推导或生成器

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
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]

我不认为这会按你认为的方式工作,对于每个A [i],它只会从函数返回。 您可以用-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

在函数结束时,l将有[-1.0,-1.0,1.0,1.0等...]

督察 G4dget的启发:

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每次运行时。 这需要解决。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM