Python 如何创建一个列表,其中每个新元素作为最后一个元素加上一个常量获得?

Python 如何创建一个列表,其中每个新元素作为最后一个元素加上一个常量获得?,python,python-2.7,list,Python,Python 2.7,List,考虑到这些变量: a_4th = 6.08 delta_a = 0.052 我想创建一个包含以下内容的列表: a = [a_4th, a_5th, a_6th, a_7th ... ] 其中: a_5th = a_4th + delta_a a_6th = a_5th + delta_a a_7th = a_6th + delta_a 此代码: a = [] # create the empty list a.insert(0, a_4th) # initialize the 1st

考虑到这些变量:

a_4th =  6.08
delta_a = 0.052
我想创建一个包含以下内容的列表:

a = [a_4th, a_5th, a_6th, a_7th ... ]
其中:

a_5th = a_4th + delta_a
a_6th = a_5th + delta_a
a_7th = a_6th + delta_a
此代码:

a = []  # create the empty list
a.insert(0, a_4th) # initialize the 1st item of the list

for i in xrange (1,19):   # I would like the list to be 18 items long. 
                          # a[0] is defined in the previous line.
  a[i] = a[i-1] + delta_a 
正在给出此错误:

回溯最近一次呼叫上次: 文件so.py,第8行,在 a[i]=a[i-1]+delta_a 索引器:列表分配索引超出范围
这个理解怎么样

a_4th =  6.08
delta_a = 0.052
a = [a_4th + i * delta_a for i in range(20)]
或您的代码,已修复:


还请注意,从列表理解的速度优势来看,它也适用于Python 2.x和Python 3.x发行版,使其更易于维护。

简单的解决方案:

a = []
a.append(a_4th)
for i in xrange(1, 19):
    a.append(a[i-1] + delta_a)
但根据你的定义:

a_5th=a_4th+δa

a_6=a_5+δa

a_7=a_6+δa

我们可以更简单地认为:

a_5th=a_4th+δa*1

a_6=a_4+δa*2

a_7th=a_4th+δa*3


并将其写成一个简单而快速的列表理解,cf Ev Kounis答案。

让我们整理一下您的代码:

a = []  # create the empty list
a.insert(0, a_4th) # initialize the 1st item of the list
这在阅读和执行上都浪费了精力。只需初始化列表:

a = [a_4th]
对于循环,您不能分配给列表中不存在的元素。可以使用附加、插入、连接或其他已定义的操作创建新的列表元素

for i in xrange (1,19):   # I would like the list to be 18 items long. 
                          # a[0] is defined in the previous line.
  a.append( a[-1] + delta_a )

是的,我从I-1中移除了I;这就引入了另一种可能的错误。只需使用最后一个索引减去列表中的一个元素。

如果我是你,我会使用Python生成器,因为它提供了额外的表达能力,能够表达无限大的序列

def succession(initial, delta):
  while True:        
    yield initial
    # value, then, the next time you call 
    initial += delta

values_generator = succession(6.08, 0.052)

# later we decide how many values we want to consume from the generator
for i in range(20):
  print(next(values_generator))
更新:

添加有关生成器的更多说明。生成器是Python提供的一种机制,允许构建高效的数据处理管道

假设你有一个从0到100_000的数字列表,你想对它应用一些转换,比如过滤,然后映射,等等,如果你使用常规的Python2映射和过滤,你的解决方案将不能很好地伸缩,因为在每一步过滤,映射,etc将计算一个新的中间结果列表,其中可能包含许多甚至可能不会在最终结果中使用的元素。构建这些功能管道的关键思想是,我们希望它们成为组合器,也就是说,我们可以组合起来创建新的功能,这些功能以后可以组合起来,但我们不想在性能上付出代价。生成器基本上是用Python、Clojure和Haskell来解决这个问题的。使用生成器,Python不会构建中间列表,而是在管道的一端推送一个值,对其进行转换,然后在另一端将其弹出,这适用于您希望转换的初始数据集中的每个元素

发电机的一个简单示例是:

def trivial_generator():
  print "running until first yield..."
  yield 1
  print "running until second yield..."
  yield 2
  print "exiting..."


generator = trivial_generator()

result = generator.next()
print "got result ", result
result = generator.next()
print "got result ", result
generator.next()
如果您运行该功能,您将获得:

running until first yield...
got result  1
running until second yield...
got result  2
exiting...
Traceback (most recent call last):
  File "foo.py", line 14, in <module>
    generator.next()
StopIteration
这说明了发电机的行为,即:

您可以通过调用包含屈服的函数来创建屈服 每次对其调用.next方法或将其传递给nextgenerator函数时,生成器的主体都将被执行,直到找到一个成品 当找到一个yield时,将返回yield中指定的值,并且生成器将保持暂停状态,直到您再次调用它的下一个方法,此时它将从上次暂停的点恢复。请注意,生成器的所有内部状态都保留在两次调用之间 如果在生成器上调用.next,但没有找到其他收益率,这意味着在生成器结束时,将引发一个StopIteration,这非常方便,因为循环的异常预期发生在迭代器的en d
在我使用的示例解决方案中,我利用了生成器的暂停/恢复功能,通过将产量放入一个无限循环中,我得到了一个生成器,它可以高效地为我提供所需的任意多个值

a[i]在0之后不存在,请尝试执行a。append@depperm符合事实的[0]是列表中唯一存在的值,谢谢…谢谢。这是编写可维护代码的一部分:不要计算可以直接引用的内容。@Prune非常感谢您的回答。1我同意这是一种更干净的初始化方式。2如果是,则列表中的元素不存在,只有[0],这就是为什么我不能执行[I]=a[I-1]+。。。3好主意,列表的最后一个元素用[-1]代替[i-1],非常感谢你的回答和建议理解列表。然而,我仍然不习惯这个特性——你知道关于这些特性的使用的好教程吗?非常感谢。非常感谢您提供的发电机解决方案。恐怕我对发电机的使用一无所知,所以我不太懂这个符号,为什么你以前用收益率,而现在用的是真的?你能解释一下每一行都在做什么吗?非常感谢你,大卫。我更新了我的答案,我希望这是一个关于发电机的很好的解释。非常感谢你的解释-我花了一些时间来消化,但步骤b
我会慢慢好起来的。再次感谢感谢您指出,事实上,这个算法可以减少到第一个值a_4th+n乘以常数。
running until first yield...
got result  1
running until second yield...
got result  2
exiting...
Traceback (most recent call last):
  File "foo.py", line 14, in <module>
    generator.next()
StopIteration