我是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] ......
如果有人知道如何解决它......
答案 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]