如何添加到 python 中的奇数索引值?
How do I add to odd index values in python?
我必须处理列表以将金额添加到每个奇数位置。例如,如果我从
开始
def main():
L = [1,3,5,7,9,11]
并且必须在每个奇数位置上加 5,输出应该是
L = [1,8,5,12,9,16]
我不知道从哪里开始,我应该使用索引和 for 循环,但我尝试的一切都不起作用。这是我目前所拥有的
def main():
L = [3,12,9,5,7,6,8]
i=0
while i < len(L):
if i%2 == 1:
print L[i]
i = i+5
elif i%2 == 0:
print L
您可以使用 list comprehension,python 的最大功能之一:
L = [1,3,5,7,9,11]
L2 = [L[i]+5 if i%2 else L[i] for i in range(0,len(L))]
,或者,正如@matiasg 建议的那样:
L2 = [L[i] + 5 * (i % 2) for i in range(len(L))]
您可以拼接您的列表。拼接是对来自另一个源列表的原始列表的索引进行分配。这个 "other source list" 可以来自从另一个切片形成的简单列表理解。
>>> L = [1,3,5,7,9,11]
>>> L[1::2] = [x+5 for x in L[1::2]]
>>> L
[1, 8, 5, 12, 9, 16]
切片语法解释
切片是当你获取一个有限序列,并用 1-2 个冒号字符对其进行索引,目的是选择一个 子序列 。具有 1 个冒号字符的切片具有以下格式:
[start:stop]
具有 2 个冒号字符的切片具有以下格式:
[start:stop:step]
可以省略参数,然后将它们设置为默认值。如果省略 start,则默认为序列的第一个索引,或 0,因为 Python 序列是从 0 开始索引的。如果省略 stop,则默认为序列的最后一个有效索引 + 1,或者等效于序列的长度。如果省略step,则默认为1。
所以当你做像 seq[1::2]
这样的切片时,你的意思是,获取 seq
的元素,索引从索引 1 开始,包括索引 1(由你指定),在索引处停止len(seq)
独占(默认值),每次步进2(由您指定)。
列表理解解释
列表推导式可以被认为是一种简洁的、Pythonic 方法,用于对可迭代对象上任意数量的潜在嵌套迭代进行映射和过滤操作。如果其中 none 对您有意义,别担心!您可以稍后学习所有地图和过滤内容。现在,只需将列表理解 [x+5 for x in L[1::2]]
视为:
newlist = []
for x in L[1::2]:
newlist.append(x+5)
然后 newlist
将被设置为列表理解的值。
或者如果您只想修改自己的代码:
def main():
L = [3,12,9,5,7,6,8]
i=0
while i < len(L):
if i%2 == 1:
print L[i]
// i= i+5
L[i] = L[i]+5
elif i%2 == 0:
print L
你犯的错误是你更改了时间变量 i 而不是列表的元素。
你非常接近:如果你想使用你的代码,最好在你的情况下使用 for
迭代列表。此外,您首先打印值然后增加它 - 因此打印值不会是更改的值。
改进后的代码如下所示:
def main():
L = [3,12,9,5,7,6,8]
for i in L:
if i%2 == 1:
print i + 5
elif i%2 == 0:
print i
将函数映射到每个奇数索引元素也可以:
>>> L = [1,3,5,7,9,11]
>>> L[1::2] = map(lambda x: x + 5, L[1::2])
>>> L
[1, 8, 5, 12, 9, 16]
@Shashank 的回答是我会这样做的方式,这只是让你知道另一种方式。
在不创建新列表或不使用列表推导的情况下解决此问题的最易读的解决方案是使用枚举。
l = [1, 3, 5, 7, 9, 11]
for i, v in enumerate(l): # i,v = index, value
if i % 2 != 0: # if the index is odd
l[i] = v + 5 # add 5 to the value
print(l)
x,y=1,21
for i in range (x,y,2):
print(i)
如果您将 'i' 用作奇数,则将范围函数与步进参数一起使用,print(i) 将为您提供范围特定部分的奇数系列。
我必须处理列表以将金额添加到每个奇数位置。例如,如果我从
开始def main():
L = [1,3,5,7,9,11]
并且必须在每个奇数位置上加 5,输出应该是
L = [1,8,5,12,9,16]
我不知道从哪里开始,我应该使用索引和 for 循环,但我尝试的一切都不起作用。这是我目前所拥有的
def main():
L = [3,12,9,5,7,6,8]
i=0
while i < len(L):
if i%2 == 1:
print L[i]
i = i+5
elif i%2 == 0:
print L
您可以使用 list comprehension,python 的最大功能之一:
L = [1,3,5,7,9,11]
L2 = [L[i]+5 if i%2 else L[i] for i in range(0,len(L))]
,或者,正如@matiasg 建议的那样:
L2 = [L[i] + 5 * (i % 2) for i in range(len(L))]
您可以拼接您的列表。拼接是对来自另一个源列表的原始列表的索引进行分配。这个 "other source list" 可以来自从另一个切片形成的简单列表理解。
>>> L = [1,3,5,7,9,11]
>>> L[1::2] = [x+5 for x in L[1::2]]
>>> L
[1, 8, 5, 12, 9, 16]
切片语法解释
切片是当你获取一个有限序列,并用 1-2 个冒号字符对其进行索引,目的是选择一个 子序列 。具有 1 个冒号字符的切片具有以下格式:
[start:stop]
具有 2 个冒号字符的切片具有以下格式:
[start:stop:step]
可以省略参数,然后将它们设置为默认值。如果省略 start,则默认为序列的第一个索引,或 0,因为 Python 序列是从 0 开始索引的。如果省略 stop,则默认为序列的最后一个有效索引 + 1,或者等效于序列的长度。如果省略step,则默认为1。
所以当你做像 seq[1::2]
这样的切片时,你的意思是,获取 seq
的元素,索引从索引 1 开始,包括索引 1(由你指定),在索引处停止len(seq)
独占(默认值),每次步进2(由您指定)。
列表理解解释
列表推导式可以被认为是一种简洁的、Pythonic 方法,用于对可迭代对象上任意数量的潜在嵌套迭代进行映射和过滤操作。如果其中 none 对您有意义,别担心!您可以稍后学习所有地图和过滤内容。现在,只需将列表理解 [x+5 for x in L[1::2]]
视为:
newlist = []
for x in L[1::2]:
newlist.append(x+5)
然后 newlist
将被设置为列表理解的值。
或者如果您只想修改自己的代码:
def main():
L = [3,12,9,5,7,6,8]
i=0
while i < len(L):
if i%2 == 1:
print L[i]
// i= i+5
L[i] = L[i]+5
elif i%2 == 0:
print L
你犯的错误是你更改了时间变量 i 而不是列表的元素。
你非常接近:如果你想使用你的代码,最好在你的情况下使用 for
迭代列表。此外,您首先打印值然后增加它 - 因此打印值不会是更改的值。
改进后的代码如下所示:
def main():
L = [3,12,9,5,7,6,8]
for i in L:
if i%2 == 1:
print i + 5
elif i%2 == 0:
print i
将函数映射到每个奇数索引元素也可以:
>>> L = [1,3,5,7,9,11]
>>> L[1::2] = map(lambda x: x + 5, L[1::2])
>>> L
[1, 8, 5, 12, 9, 16]
@Shashank 的回答是我会这样做的方式,这只是让你知道另一种方式。
在不创建新列表或不使用列表推导的情况下解决此问题的最易读的解决方案是使用枚举。
l = [1, 3, 5, 7, 9, 11]
for i, v in enumerate(l): # i,v = index, value
if i % 2 != 0: # if the index is odd
l[i] = v + 5 # add 5 to the value
print(l)
x,y=1,21
for i in range (x,y,2):
print(i)
如果您将 'i' 用作奇数,则将范围函数与步进参数一起使用,print(i) 将为您提供范围特定部分的奇数系列。