gpt4 book ai didi

python - 一些复杂的列表计算和切片;如何让它发挥作用?

转载 作者:太空宇宙 更新时间:2023-11-04 01:20:14 27 4
gpt4 key购买 nike

我最近一直在研究一个问题。这个任务似乎很容易解释,但对我来说编码起来很复杂。我尝试了很多变体,但所有变体都缺少一些东西。不确定是什么。需要外面的人说说,因为我的思维方式太深了,有时会注意到一些简单的东西

我会尽量简化这里的问题,让它更容易理解。

所以我们有一个包含对象的列表

lst = [A0, A1, A2, A3, A4]

我需要做的是,运行一个名为 predict() 的方法,并从 lst 中的每个元素,获取预测元素 Ap。此方法必须运行 3 次,因此对于 A0,我将得到 Ap1Ap2Ap3。但是,predict() 执行的计算依赖于列表的前一个元素及其提供的结果。所以 Ap1 仅由 A0 计算,而 Ap2A0Ap1 计算>(作为输入传递给 predict()Ap3 是根据 A0、Ap1、Ap2 计算的。所有这些计算都已完成fone A0。随着初始输入长度的增加,考虑 lst 中的每个后续元素,计算变得更加复杂。

下面的“流程图”可能会有帮助。

============================================= =========

1) 案例A0

A0 ---> 预测([A0]) ---> Ap1

A0, Ap1 ---> 预测([A0,Ap1]) ---> Ap2

A0, Ap1, Ap2 ---> 预测([A0,Ap1,Ap2]) ---> Ap3

============================================= ==========

2) case A1 - 初始输入也考虑前一个元素

A0, A1 ---> 预测([A0,A1]) ---> Ap2

A0, A1, Ap2 ---> 预测([A0,A1,Ap2]) ---> Ap3

*|A0|* A1, Ap2, Ap3 ---> 预测([Ap1,Ap2,Ap3]) ---> Ap4 [缩短输入]

这是棘手的部分,因为您会注意到当输入包含 3 个以上的元素时,输入数据会向右移动一位。我决定采用这种“滑动窗口”方法,否则用于计算 A17 的输入将包括所有 AX,其中 X < 17。所以初始输入最多3个元素即可

============================================= =============

为了进一步说明,我还将提供 A2 的案例。

3) 案例A2

A0, A1, A2 ---> 预测([A0,A1,A2]) ---> Ap3

*|A0|*, A1, A2, Ap3, ---> 预测([A1,Ap2,Ap3]) ---> Ap4 [缩短输入]

*|A0|* *|A1|*, Ap2, Ap3, Ap4 ---> 预测([Ap2,Ap3,Ap4]) ---> Ap5 [缩短输入]

============================================= ==============

如您所见,当初始输入长于 3 时有一个通用模式,并且必须使用一些“滑动窗口”方法。并且有初始输入小于3的特定情况

为了简化所有这些事情,我使用了以下代码:

current_trace = [[2,4,6,7,6,3],[1,2,5,7,2,7],[6,4,7,1,8,2]]


def predict(lst):
print "predicting for", lst
print "result", max(lst) + 0.0
return max(lst) + 0.0

方法一:

for user_trace in current_trace:
y = 1
for counter in range(len(user_trace)):
while y <= 3:
x = 0
intermediate_list = user_trace[x:y]
while len(intermediate_list) <= 5:
next_prediction = predict(intermediate_list)
intermediate_list.append(next_prediction)
#predict(user_trace[x:y])
#print "@while" ,user_trace[x:y]
print "end of prediction \n"
y += 1

else:
print "\n"
x = y - 3
if len(user_trace[x:y]) == 3:
predict(user_trace[x:y])
#print "@else" ,user_trace[x:y]
else:
pass
y += 1

方法二:

for user_trace in current_trace:
for slicer in range(len(user_trace)):
new_list = user_trace[:slicer+1]
if len(new_list) <= 3:
print "slicer:", slicer
print new_list
else:
print "slicer:", slicer
newer_list = new_list[-3:]
print newer_list

在这两种情况下,我都遗漏了一些东西,希望有人能给我一个评论或有用的建议,因为我已经在这件事上忙了几天了,这让我很沮丧!

提前致谢

最好的,W

最佳答案

我认为您想要的是列表中长度(最大)3 的移动窗口。您可以按如下方式执行此操作:

def windows(l, n=3):
for x in range(1, len(l)+n): # or len(l)+1 to stop at last full window
yield(l[max(0, x-n):x])

例如:

>>> list(windows([1,2,3,4,5]))
[[1], [1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5], [5]]

关于python - 一些复杂的列表计算和切片;如何让它发挥作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21738109/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com