可以在i,i+;Python中的1到i循环?
是否可以在下面重写此循环:可以在i,i+;Python中的1到i循环?,python,for-loop,indexing,for-in-loop,Python,For Loop,Indexing,For In Loop,是否可以在下面重写此循环: from typing import List def adjacentElementsProduct(inputArray: List[int]) -> int: product_list = [] for i in range(len(inputArray) - 1): product_list.append(inputArray[i] * inputArray[i+1]) return max(product
from typing import List
def adjacentElementsProduct(inputArray: List[int]) -> int:
product_list = []
for i in range(len(inputArray) - 1):
product_list.append(inputArray[i] * inputArray[i+1])
return max(product_list)
变成类似于:
for i in inputArray:
product_list.append(i, the thing after i)
如果有任何帮助,您可以制作一个生成器函数来帮助您执行以下操作:
def pairs(seq):
it = iter(seq)
val1 = next(it)
for val2 in it:
yield val1, val2
val1 = val2
for x, y in pairs(range(10)):
print(f"x={x} y={y}")
给出:
x=0 y=1
x=1 y=2
x=2 y=3
x=3 y=4
x=4 y=5
x=5 y=6
x=6 y=7
x=7 y=8
x=8 y=9
您可以
zip
改变序列本身的版本:
seq = ['a', 'b', 'c', 'd', 'e', 'f']
for i, j in zip(seq, seq[1:]):
print(i, j)
输出:
a b
b c
c d
d e
e f
要获取所有相邻对,可以使用
zip
pairs = zip(inputArray, inputArray[1:])
然后您可以使用max
并将另一个生成器传递给它,该生成器将对相乘以获得最大和
max(a * b for a, b in pairs)
您可以通过删除中间列表来缩短它,但任何其他内容都会模糊您正在做的事情
def adjacentElementsProduct(inputArray: List[int]) -> int:
return max(inputArray[i] * inputArray[i+1]
for i in range(len(inputArray) - 1))
您是否试图将其用于可以迭代但不能索引的情况?哦,不,没有这样的限制,我只是想看看是否可能,因为语法看起来比使用索引更干净、更“Pythonic”。生成器解决方案就是为了考虑这种可能性而设计的,但是,如果您只需要索引序列,那么zip解决方案看起来是您最好的选择—既漂亮又简洁。我可以从哪里了解更多关于您在这里使用for和return语句进行反转的内容?我以前从未见过这个,很酷。它们被称为。它们构成了“列表理解”的核心,但可以在其他地方使用。这可能是最有效的解决方案,因为它不会试图创建列表部分的副本。虽然这看起来很不错,但实际上并不像使用索引那么简单。好的,非常酷,谢谢,我确实用zip编写了一个版本,但是我的版本中有一些优化。因此,为了确保我了解您的版本中发生了什么:Zip仅适用于较小的列表,因此您不必使用大小相同的列表,您可以在从pairs返回的迭代器上调用max,避免将内容转换为列表。对吗<代码>元组列表=列表(zip(inputArray,inputArray[1:])产品列表=[(x*y)用于x,y在元组列表中]返回(最大值(产品列表))是的,这是正确的
zip
返回元组迭代器,该元组是传递给它的最小iterable的长度。是的,您可以在生成器/迭代器上调用max
,这比构建只使用一次的列表要高效得多