如果有很多列表,如何最小化代码?

时间:2017-10-07 13:38:55

标签: python list

我正在制作一个模拟布朗运动的代码。

from random import random
import matplotlib.pyplot as plt
import numpy as np

N=100
p=0.5
l=1
x1=[]
x2=[]

x1.append(0)
x2.append(0)

for i in range(1, N):
    step = -l if random() < p else l
    X1 = x1[i-l] + step
    x1.append(X1)

for i in range(1, N):
    step = -l if random() < p else l
    X2 = x2[i-l] + step
    x2.append(X2)

x1mean=np.array(x1)
x2mean=np.array(x2)

mean=[]
for j in range (0,N):
    mean.append((x1mean[j]+x2mean[j])/2.0)

plt.plot(mean)
plt.plot(x1)
plt.plot(x2)
plt.show()

这段代码为2个不同的粒子提供了位移,但为了正确计算平均位移,我需要有大量的粒子,比如100.你可以看到,我正在寻找一个凝聚代码的方法,因为我不能重复相同的代码100次。

有没有办法创建一个循环,使所有这些代码都是1变量的函数,即粒子数?

感谢。

2 个答案:

答案 0 :(得分:0)

此?

from random import random
import matplotlib.pyplot as plt
import numpy as np

N=100
p=0.5
l=1

mydict = {}

for n in range(100):
    mydict[n] = []
    mydict[n].append(0)

    for i in range(1, N):
        step = -l if random() < p else l
        X1 = mydict[n][i-l] + step
        mydict[n].append(X1)

for k,v in mydict.iteritems():
    plt.plot(v)

# mean
plt.plot([np.mean(i) for i in mydict.values()])

plt.show()

答案 1 :(得分:0)

我无法为您提供有效的python代码,因为到目前为止我还没有编写一行python代码。但我可以告诉你如何解决问题。

假设:

N : Number of Moves
P : Number of Particles

第1步:
创建一个生成数组/列表并返回它的方法。因此,您可以重复使用它,避免复制代码。

def createParticleMotion(N, p, l):
    x1=[]
    x1.append(0)

    for i in range(1, N):
        step = -l if random() < p else l
        X1 = x1[i-l] + step
        x1.append(X1)

    return x1

第2步:
创建列表列表,我们称之为particleMotions。它自己的列表有 P 列表中的 N 移动。通过从第一步调用方法并按返回的列表/数组附加列表paticleMotions,在for循环中为您填充粒子数 P

可能是Python: list of lists的答案,可以帮助您创建此内容。

第3步:
在创建并填充particleMotions之后,在double for循环中使用此列表并计算均值并将其存储在均值列表中。

mean=[]
for n in range (0,N):
    sum=0
    for p in range (0,P):
        sum = sum + particleMotions[p][n]

    mean.append(sum/P)

现在您可以使用下一个for循环来绘制结果。

for particle in range (0,P):
    plt.plot(particleMotions[particle])

所以再次不要因为语法错误而责备我。我不是植物开发者。我只想给你一个解决问题的方法。