如何在没有列表推导的情况下解决这个问题

时间:2011-07-08 16:27:54

标签: python

我是python中的新手,我正在尝试找到解决这个问题的最佳方法,我需要了解这是否只能通过循环和函数来实现(不包括列表推导)。 我还需要找到更优雅的方法来解决这类问题, 简单的功能?递归性?列出理解?发电机功能?在本文的最后是我的尝试。谢谢。

我有这个清单:

base=[1,2]

alist=[1,2,3]

blist=[3,2,1]

我需要为每个“时间步骤”找到这个:

result(j)=base(j-1)+alist(j)-blist(j)

这是我需要找到的结果:

[1+1-3 2+1-3]

[1+1-3+2-2 2+1-3+2-2] 

[1+1-3+2-2+3-1 2+1-3+2-2+3-1]

这是我的尝试:它不起作用,因为在每次迭代时我都要考虑以前的base值。我试过......

def calc(base,alist,blist):
    lineNum=0
    while lineNum < 3:
        result=[]
        for i in range(len(base)):
           result.append(base[i]+alist[lineNum]-blist[lineNum]) 
        print To
        lineNum+=1

3 个答案:

答案 0 :(得分:0)

尝试以下方法:

def calc(base, alist, blist):
    for num in range(1, 4):
        result = []
        for b in base:
            result.append(b + sum(alist[:num]) - sum(blist[:num]))
        print result

以下是您提供的数据的结果:

>>> calc(base, alist, blist)
[-1, 0]
[-1, 0]
[1, 2]

或者,您可以在没有sum()调用的情况下执行此操作,方法是保留之前的结果,只需添加/减去alistblist中的下一个值,这可能会更有效:< / p>

def calc(base, alist, blist):
    result = base[:]
    for num in range(3):
        for i, v in enumerate(result):
            result[i] = v + alist[num] - blist[num]
        print result

答案 1 :(得分:0)

您只想在每次迭代中添加列表和列表的下一个元素,以存储先前的值并将此元素添加到其中。

base=[1,2]
alist=[1,2,3]
blist=[3,2,1]

""" [1+1-3 2+1-3]

[1+1-3+2-2 2+1-3+2-2]

[1+1-3+2-2+3-1 2+1-3+2-2+3-1] """

this_step = "" for ctr in range(len(alist)): this_step += "+%d -%d " % (alist[ctr], blist[ctr]) for num in base: print "%d %s " % (num, this_step), print "\n"

答案 2 :(得分:0)

你也可以使用numpy:

import numpy as np

def calc(bas, a, b):
    r = bas.copy()
    for i in range(a.size):
        r += a.item(i)
        r -= b.item(i)
        yield r

base = np.array([1,2])
alist = np.array([1,2,3])
blist = np.array([3,2,1])

for result in calc(base, alist, blist):
    print result

输出:

[-1  0]
[-1  0]
[1 2]