Python 循环定义限制麻烦



我是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]

最新更新