在python中将列表元组添加到列表中

时间:2014-09-12 22:54:43

标签: python list tuples

我不理解将其元素也是列表元素的元组添加到包含所有信息的另一个列表的语法。

我正在尝试创建一个轨迹列表,其中包含飞行过程中射弹的飞行数据元组。我想使用元组,以便能够及时查看每个时刻的所有信息。

import random
import math

gg = -9.81 # gravity m/s**2
tt = 10 **-9 # seconds
wind = random.randint(-10,10)   # m/s

#position
x=random.randint(0,100)   # m/s

#projectile

v0 = float(raw_input('Enter the initial velocity (m/s) -> '));
theta = float(raw_input('Enter the initial launch angle of projectile (degrees) -> '));

theta *= (180/3.14159265359)

xx = [x]
yy = [.000000000000000000001]
dz =[v0]
time = [0];


data = ( time, xx, yy, dz)
traj = [data]


while yy[-1] >0:

    traj.append ( math.sqrt( (traj[-1][3][-1] * math.sin(theta) + gg * tt)** 2+        (traj[-1][4] * math.cos(theta) -wind) ** 2 ))    # velocity
    traj.append ( traj[-1][2][-1] + dz[-1] * math.sin(theta) * tt + .5* gg * tt)    # y position
    traj.append ( traj[-1][1][-1] * dz[-1] * math.cos(theta) - wind * tt)    # x position
    traj.append ( traj[-1][0][-1] + tt)     # time


print traj

编辑: 我会输入初始角度和速度的整数(即-45,45)。预期输出将是包含分别对应于时间,x坐标,y坐标和速度的四个元素的元组列表。目前,我收到的元组索引超出范围错误。

2 个答案:

答案 0 :(得分:1)

你在哪里

traj[-1][4]

在您的第一个traj.append行中,traj[-1]data,而data只有四个元素长,因此最后一个项目位于索引3处。

答案 1 :(得分:0)

您的代码的问题在于您将在while循环中计算的值附加到traj列表。这不会更新列表xxyytimedz。 您可以按以下方式修改代码

while yy[-1] > 0:
    dz_next = math.sqrt( (yy[-1] * math.sin(theta) + gg * tt)** 2+(dz[-1] * math.cos(theta) -wind)** 2)
    yy_next = yy[-1] + dz[-1] * math.sin(theta) * tt + .5* gg * tt
    xx_next = xx[-1] * dz[-1] * math.cos(theta) - wind * tt

    dz.append(dz_next)    # velocity
    yy.append(yy_next)    # y position
    xx.append(xx_next)    # x position
    time.append(time[-1] + tt)     # time

我认为更好的方法是以下

data = ( 0, x, 1e-20, v0) # initial data
traj = [data]

while True:
    t, x, y, v = traj[-1]
    if y < 0:
        break

    traj.append((t + tt, # time
                 x * v * math.cos(theta) - wind * tt, # x position
                 y + v * math.sin(theta) * tt + .5* gg * tt, # y position
                 (y* math.sin(theta) + gg * tt)** 2 + (v*math.cos(theta) -wind) ** 2) # velocity
    )


    print traj
    t_traj, x_traj, y_traj, z_traj = zip(*traj)