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