Python循环定义限制麻烦

时间:2012-09-22 02:03:19

标签: python for-loop range

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

如果有人知道如何解决它......

3 个答案:

答案 0 :(得分:2)

通过索引迭代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:])]

这称为列表理解。如果你把它粘贴到解释器后无法猜到它是什么,请在标准文档和谷歌提供的许多文章中阅读它。

该代码在行动;

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

答案 1 :(得分:1)

使用对称差异查找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.

答案 2 :(得分: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]等。< / p>

您可能希望首先创建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]