可以在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
,这比构建只使用一次的列表要高效得多