如何使用索引向后枚举Python中的列表(从末尾到开头)

Pon*_*ngo 8 python reverse loops

我想迭代从 Digikey api 接收到的数据列表,任何谷歌搜索都没有太多运气,因为该功能enumerate(reversed(part.standard_pricing))不起作用,并且part.standard_pricing由于某种原因您无法逆转类似的事情是需要的:

for b_idx in range(part.standard_pricing, -1, -1):
            print(f"Test at: {b_idx} , Q: {part.standard_pricing[b_idx].break_quantity}")
            if PCountQ >= part.standard_pricing[b_idx].break_quantity:
                parts_df['PRICE_PER_PCB_Q'][idx] = part.standard_pricing[b_idx].unit_price * PCountQ
                break
Run Code Online (Sandbox Code Playgroud)

但范围也不适用于列表......

我想这样做:

for b_idx, price_break in enumerate(part.standard_pricing):
Run Code Online (Sandbox Code Playgroud)

只是从末尾开始part.standard_pricing,让索引减少而不是增加

关于如何以Python方式做到这一点有什么想法吗?

The*_*Guy 11

您可以调用enumerate列表,然后将枚举对象转换为列表,它将给出元组列表,其中每个元组都有索引和值,最后迭代reversed列表。

data = [1,2,3,4]
for i,d in reversed(list(enumerate(data))):
    print(i,d)
    
3 4
2 3
1 2
0 1
Run Code Online (Sandbox Code Playgroud)

如果您不希望内存中存在序列的另一个副本,您可以创建自定义生成器

def reverseEnum(data: list):
    for i in range(len(data)-1, -1, -1):
        yield (i, data[i])
for i, d in reverseEnum([1, 2, 3, 4]):
    print(i, d)
    
3 4
2 3
1 2
0 1
Run Code Online (Sandbox Code Playgroud)

  • 虽然这有效(+1),但它在内存中创建一个新列表只是为了迭代内存中已有的内容。 (2认同)

Mus*_*dın 8

我们也可以reverse使用列表并对索引使用一些数学运算,而不是d 列表:enumerateenumeratereversed

the_list = ["zeroth", "first", "second"]
length = len(the_list)

for j, value in enumerate(reversed(the_list), start=1):
    # "the" index is this
    i = length - j
    print(i, value)
Run Code Online (Sandbox Code Playgroud)

要得到

2 second
1 first
0 zeroth
Run Code Online (Sandbox Code Playgroud)

您还可以使用 fori = -j和 get -1, -2, -3,当索引时,它们分别给出相同的值2, 1, 0