Python循环定义限制了麻烦

Python循环定义限制了麻烦,python,for-loop,range,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

我是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列表总是从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]

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]

按索引迭代python列表(我假设您指的是
列表
)是不常见的。 您正在对项目进行操作,因此更惯用的方法是:

for prev, next in zip(a, a[2:]):
    # do whatever
在标准文档中查找
zip
。这两个变量是使用sequence assignment从
zip
的结果分配的,sequence assignment就是将逗号分隔的变量列表绑定到序列元素的地方

您正在做的第二件事是在循环中附加到列表。这类事情非常常见,因此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]
>>>

按索引迭代python列表(我假设您指的是
列表
)是不常见的。 您正在对项目进行操作,因此更惯用的方法是:

for prev, next in zip(a, a[2:]):
    # do whatever
在标准文档中查找
zip
。这两个变量是使用sequence assignment从
zip
的结果分配的,sequence assignment就是将逗号分隔的变量列表绑定到序列元素的地方

您正在做的第二件事是在循环中附加到列表。这类事情非常常见,因此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]
>>>

使用对称差分查找
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。

使用对称差分查找
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。

欢迎来到stackoverflow。恐怕我听不懂你的问题。您可以对其进行编辑以使其更清晰。拿出一个最小的工作示例,我们可以运行它并准确地看到发生了什么。这可能有助于我们理解您的困惑。您需要解释“不工作”是什么意思。你希望它做什么,它在做什么?欢迎来到stackoverflow。恐怕我听不懂你的问题。您可以对其进行编辑以使其更清晰。拿出一个最小的工作示例,我们可以运行它并准确地看到发生了什么。这可能有助于我们理解您的困惑。您需要解释“不工作”是什么意思。你想要它做什么,它在做什么?首先,我很抱歉英语不流利。谢谢你的欢迎。我是Python的新手,说实话,我把它搞砸了。是的,你的代码正在工作!使用-1的好主意,非常简单。我试着用I-1(n-1)。。只是,我没有提到我需要C[0]=C[1]作为程序的上限。我将在C[-1]之后逻辑地添加它,对吗?C所做的是找到列表中相邻点的平均值。稍后我将使用C和D创建一个新的列表E,它们的对称性是错误的。现在问题解决了。谢谢大家的帮助和时间只是好奇。。如果n>1,为什么要使用。。。您可以稍后定义C[1]和C[0]。。。我知道这是正确的方法,你为什么这么做?为了保持对称性?首先,我很抱歉我的英语不流利。谢谢你的欢迎。我是Python的新手,说实话,我有点搞砸了。是的,你的代码正在工作!使用-1的好主意,非常简单。我试着用I-1(n-1)。。只是,我没有提到我需要C[0]=C[1]作为程序的上限。我将在C[-1]之后逻辑地添加它,对吗?C所做的是找到列表中相邻点的平均值。稍后我将使用C和D创建一个新的列表E,它们的对称性是错误的。现在问题解决了。谢谢大家的帮助和时间只是好奇。。如果n>1,为什么要使用。。。您可以稍后定义C[1]和C[0]。。。我知道这是正确的方法,你为什么这么做?留