我是Python的新手...我正在处理一个包含 10 个元素的数组 A[0,10] 尝试执行此循环:
for i in range(1, 9):
C.append((A[i+1]-A[i-1])/2)
要找到每个点的平均值...
之后如果我想打印结果:
print(i, A[i], C[i])
print(i, A[i], C[i-2])
第二个打印只起作用,第一个打印不起作用......请问为什么这样?我还需要定义 C[1] 和 C[10] 的第一个和最后一个值我不能这样做,因为第一个值是 C[-2],即 C[9] ......
如果有人知道如何解决它....
按索引迭代 python 列表并不常见(我假设你的意思是list
)。您正在对项目对进行操作,因此更惯用的方法是:
for prev, next in zip(a, a[2:]):
# do whatever
在标准文档中查找zip
。这两个变量是使用序列赋值从zip
的结果中赋值的,而序列赋值正是逗号分隔的变量列表绑定到序列元素的位置。
您正在做的第二件不合时宜的事情是在循环中附加到列表中。这种事情是如此普遍,以至于python有一个特定的语法:
[(next - prev)/2 for prev, next in zip(a, a[2:])]
这称为列表理解。如果您无法猜测将其粘贴到解释器后的作用,请在标准文档和Google提供的许多文章中阅读有关它的信息。
该代码在操作;
>>> import random
>>> a = range(5,15)
>>> random.shuffle(a)
>>> a
[11, 5, 12, 14, 6, 7, 8, 13, 10, 9]
>>> [(next - prev)/2 for prev, next in zip(a, a[2:])]
[0, 4, -3, -4, 1, 3, 1, -2]
>>>
您使用对称差分来查找C
但边缘点 (0,9) 只有一个相邻点。您可以通过对边缘点使用左右差异来修复它:
n = len(A) # 10 in your case
C = [0.] * n
if n > 1:
C[0] = (A[1] - A[0]) / 2.
C[-1] = (A[-1] - A[-2]) / 2.
for i in xrange(1, n-1):
C[i] = (A[i+1] - A[i-1]) / 2.
它是否合适取决于您以后希望如何使用C
列表。
如果您需要C[0] = C[1]
那么它甚至更简单:
n = len(A)
C = [0.] * n
for i in xrange(1, n-1):
C[i] = (A[i+1] - A[i-1]) / 2.
if n > 1:
C[0] = C[1]
C[-1] = C[-2] # for symmetry
如果n == 0
即 A 为空,则 C 为空。
如果n == 1
,即 A 只有一个元素,那么 C 只有一个元素:C[0] = 0.
Python 列表总是从 0 开始索引。如果你这样做
c = [] # c is a list
c.append(3) # append 3 to the end of the list
print c # => [3]
print c[0] # => 3
所以你的代码把 (A[0]+A[2])/2 放到 C[0],然后把 (A[1]+A[3])/2 放到 C[1] 中,依此类推。
您可能希望首先创建 C 作为包含适当数量的 0 的列表,例如
c = [0.]*10 # create a 10-item list
# calculate smoothed values from a
for i in xrange(1,9):
c[i] = 0.25*a[i-1] + 0.5*a[i] + 0.25*a[i+2]
# clean up the ends
c[0] = 0.75*a[0] + 0.25*a[1]
c[9] = 0.25*a[8] + 0.75*a[9]