【发布时间】:2018-07-12 15:42:12
【问题描述】:
假设我有一个清单:
lis = [4, 8, 2, 4, 6]
我想遍历列表中的每个值并将其加倍,但如果遇到数字 2,则在将其加倍后,我应该跳过下一个数字,然后仅将 on 加倍。例如,最后我的列表应该是这样的。
lis = [8, 16, 4, 4, 12]
这可以通过 for 循环实现吗?
【问题讨论】:
假设我有一个清单:
lis = [4, 8, 2, 4, 6]
我想遍历列表中的每个值并将其加倍,但如果遇到数字 2,则在将其加倍后,我应该跳过下一个数字,然后仅将 on 加倍。例如,最后我的列表应该是这样的。
lis = [8, 16, 4, 4, 12]
这可以通过 for 循环实现吗?
【问题讨论】:
该算法归结为您使用什么数字将列表中的项目加倍(1 或 2)。这是我对这个问题的看法:
lis = [4, 8, 2, 4, 6]
def double_with_my_condition(l, doubler=2):
for i in l:
yield i * doubler
if i == 2:
doubler = 1
continue
doubler = 2
new_lis = [*double_with_my_condition(lis)]
print(new_lis)
输出:
[8,16,4,4,12]
【讨论】:
我写了一个非常简单的解决方案,应该很容易理解,因为看起来你是一个初学者
lis = [4, 8, 2, 4, 6]
new_lis = []
i = 0
while (i < len(lis)):
new_lis.append(lis[i] * 2)
if (lis[i] == 2):
if (i+1 < len(lis)):
new_lis.append(lis[i+1])
i = i+1
i = i+1
print(new_lis)
这将创建一个新列表,遍历旧列表,将翻倍的值附加到新列表中,如果索引处的值为 2,则跳过一个数字。
【讨论】:
这行得通!
Method-1:
lis = [4, 8, 2, 4, 6]
for i in range(len(lis)-1, -1, -1):
if(lis[i-1] == 2):
continue
else:
lis[i] = lis[i]*2
lis
Method-2:
lis1 = [4, 8, 2, 4, 6]
indices = [i+1 for i, x in enumerate(lis1) if x == 2] #Storing indices of next to 2
lis2 = [i*2 for i in lis1]
for i in indices:
lis2[i] = lis1[i] # replacing the previous values
print(lis2)
【讨论】:
你也可以使用列表推导
lis = [4, 8, 2, 4, 6]
print([lis[x] if lis[x - 1] == 2 else lis[x] * 2 for x in range(len(lis))])
【讨论】: