删除多个列表的最后一个值的更优雅的方法是什么?

时间:2018-04-21 15:10:47

标签: python list numpy

我有多个列表,即XYVXVYRTKEPETE,我需要在迭代中断后删除它们的第(i + 1)个值。我现在能做的就是如果我这样做:

del X[i+1:]
del Y[i+1:]
del VX[i+1:]
del VY[i+1:]
del R[i+1:]
del T[i+1:]
del KE[i+1:]
del PE[i+1:]
del TE[i+1:]

我觉得它看起来很丑陋。在这种情况下,有没有办法最小化线的使用。也许是一个循环,它只做了1或2行?

编辑: 我不想包括我的代码正文,因为我知道我的很多同事都在做同样的问题,我不希望任何人剽窃。无论如何,这就是我所做的。

def F_1(X):
    return VX

def F_2(X):
    return VY

def F_3(X, Y):
    return -G*EM*X/((X**2 + Y**2)**(3/2))

def F_4(X, Y):
    return -G*EM*Y/((X**2 + Y**2)**(3/2))

def RKutta(F_1, F_2, F_3, F_4, XSTART, YSTART, VXSTART, VYSTART):
    N = 100000
    X, Y = np.zeros([N+1]), np.zeros([N+1])
    VX, VY = np.zeros([N+1]), np.zeros([N+1])
    R, T =  np.zeros([N+1]), np.zeros([N+1])
    KE, PE, TE = np.zeros([N+1]), np.zeros(N+1), np.zeros([N+1])

    X[0], Y[0] = XSTART, YSTART
    VX[0], VY[0] = VXSTART, VYSTART
    T[0] = 0
#    KE[0], PE[0], TE[0] = KE, PE, TE

    for i in range (1,N):

        K_1X = F_1(VX[i-1])
        K_1Y = F_2(VY[i-1])
        K_1VX = F_3(X[i-1], Y[i-1])
        K_1VY = F_4(X[i-1], Y[i-1])

        K_2X = F_1(VX[i-1] + (H*K_1VX/2))
        K_2Y = F_2(VY[i-1] + (H*K_1VY/2))
        K_2VX = F_3(X[i-1] + (H*K_1X/2), Y[i-1] + (H*K_1Y/2))
        K_2VY = F_4(X[i-1] + (H*K_1X/2), Y[i-1] + (H*K_1Y/2))

        K_3X = F_1(VX[i-1] + (H*K_2VX/2))
        K_3Y = F_2(VY[i-1] + (H*K_2VY/2))
        K_3VX = F_3(X[i-1] + (H*K_2X/2), Y[i-1] + (H*K_2Y/2))
        K_3VY = F_4(X[i-1] + (H*K_2X/2), Y[i-1] + (H*K_2Y/2))

        K_4X = F_1(VX[i-1] + H*K_3VX)
        K_4Y = F_2(VY[i-1] + H*K_3VY)
        K_4VX = F_3(X[i-1] + H*K_3X, Y[i-1] + H*K_3Y)
        K_4VY = F_4(X[i-1] + H*K_3X, Y[i-1] + H*K_3Y)

        X[i] = X[i-1] + (H/6)*(K_1X + 2*K_2X + 2*K_3X + K_4X)
        Y[i] = Y[i-1] + (H/6)*(K_2Y + 2*K_2Y + 2*K_3Y + K_4Y)
        VX[i] = VX[i-1] + (H/6)*(K_1VX + 2*K_2VX + 2*K_3VX + 2*K_4VX)
        VY[i] = VY[i-1] + (H/6)*(K_1VY + 2*K_2VY + 2*K_3VY + 2*K_4VY)
        R[i] = ((X[i])**2 + (Y[i])**2)**(0.5)
        T[i] = T[i-1] + H

        KE[i] = ((VX[i]**2 + VY[i]**2)/2)
        PE[i] = (-1*G*EM/R[i])
        TE[i] = KE[i] + PE[i]

        if R[i] < 6.371E6:  #if orbit radius is less than Earth radius
            break

        for sublist in [X, Y, VX, VY, R, T, KE, PE, TE]:
            del sublist[i+1:]

    return X, Y, VX, VY, R, T, KE, PE, TE

X = 3.84E8
Y = 0
X, Y, VX, VY, R, T, KE, PE = RKutta(F_1, F_2, F_3, F_4, X, Y, VX, VY)

plt.plot(X, Y, label = "")
plt.xlabel("X distance (m)")
plt.ylabel("Y distance (m)")
plt.title("X against Y")
plt.legend()
plt.show()

我正在尝试实施四阶Runge-Kutta方法来模拟绕地球运行的火箭。目标是最终打印出火箭的轨道。我还在搞清楚我的代码,所以他们还没有工作。如何使用类改进这个?

3 个答案:

答案 0 :(得分:2)

将列表的引用保留在另一个数据结构中,然后循环遍历以删除所有内容:

for sublist in [X, Y, VX, VY, R, T, KE, PE, TE]:
    del sublist[i+1:]

编辑: 你想使用类而不是列表。

现在你有九个列表,每个列表中的第i个元素对应一个关于第i个火箭的属性。所以你可以创建一个火箭类:

class Rocket:
    def __init__(self, X, Y, VX, VY, R, T, KE, PE, TE):
        self.X = X
        self.Y = Y
        self.VX = VX
        ...

这将允许您访问每个火箭的属性,如下所示:

Saturn_V = Rocket(1, 2, 3, 4, 5, 6, 7, 8, 9)
Saturn_V.X
>>>1

现在可以使用一个火箭列表而不是九个单独的列表:

rocket_list = [Saturn_V, Sputnik, Atlas-Agena ...]

要删除有关特定火箭的所有信息,您只需从列表中删除一个元素:

del rocket_list[0] #removes Saturn_V and all its attributes

答案 1 :(得分:1)

这是我在评论中试图解释的内容。虽然我不知道你正在做什么的细节,但希望这足以给你一般的想法:

# Define a class to hold each group of values.
class Example:
    def __init__(x, y, vx, vy, r, t, ke, pe, te):
        self.x  = x
        self.y  = y
        self.vx = vx
        self.vy = vy
        self.r  = r
        self.t  = t
        self.ke = ke
        self.pe = pe
        self.te = te

# Somehow create a list of Example instances.
my_data = [Example(x1, y1, vx1, vy1, r1, t1, ke1, pe1, te1),
           Example(x2, y2, vx2, vy2, r2, t2, ke2, pe2, te2),
             ...
           Example(xN, yN, vxN, vyN, rN, tN, keN, peN, teN)]

# Then you could do what you asked about like this:
for i, elem in enumerate(my_data):
    if elem.ke > elem.pe:  # Done?
        break

del my_data[i+1:]  # Delete remaining elements in my_data.

答案 2 :(得分:0)

好的,所以你想要删除各种列表的最后一个元素,我将以一种非常简单的方式解释这一点。您可以将所有这些列表放在新列表中,然后申请循环以删除最后一个元素。例如:

x=[1,2,3,4,5]
y=[1,2,3,4,5]
z=[1,2,3,4,5]
l=[x,y,z]
for i in range (len(l)):
    del l[i][-1]

这将删除所有列表的最后一个元素。

相关问题