[英]How can I solve this without list comprehensions
我是 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
嘗試以下操作:
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]
或者,您可以通過保留先前的結果並僅從alist
和blist
中添加/減去下一個值來在不調用sum()
的情況下執行此操作,這可能更有效:
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
您只想在每次迭代中添加 alist 和 blist 的下一個元素,因此存儲前一個值並將此元素添加到其中。
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"
您也可以使用 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
Output:
[-1 0]
[-1 0]
[1 2]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.