【问题标题】:Python: Variable step length in a for loop [duplicate]Python:for循环中的可变步长[重复]
【发布时间】:2017-10-25 10:02:20
【问题描述】:

我想从数组的 for 循环中获取步长值。比如,

step = [0,1,2,15,3,87] #values in no order  
for i in range(0, len(raw_pkt), step):

应该在每次迭代中更新步长值。有什么解决方法吗?我知道range() 需要一个整数值而不是一个列表。但我想在每次迭代时从列表中获取值。

【问题讨论】:

  • 不,在这种情况下,您最好使用while 循环。 range(..) 被构造一次。
  • @WillemVanOnsem 请求您的欺骗锤服务... ^
  • @DavidG 我不能,我添加了标签。

标签: python for-loop range


【解决方案1】:

我猜你想要的是itertools.accumulate

from itertools import accumulate

for i in accumulate([0,1,2,15,3,87]):
    print(i)

# would print 0 1 3 18 21 108

【讨论】:

  • 我认为这不是问题所在。我认为问题是如何使用另一个列表中定义的步骤迭代“raw_pkt”。 - 我可能错了
  • @EvilSmurf 我想这正是那个问题的意义所在。这个问题只涉及范围创建,而不是另一个数组的索引。
【解决方案2】:

遍历step:

如果您考虑您想要实现的目标,您并不真正关心您尝试使用indexlist,因为step 的值是固定的。所以即使raw_pkt 的长度是一百万,因为你的step 列表只有6 的长度,你将永远只有6 indexes

一旦您意识到这一点,代码就变得非常简单,您只需要将iterate 覆盖step 值并增加variable。这个variable 可以用于index 一个list 或其他什么,但这并不重要。

这使得代码非常简短:

step = [0, 1, 2, 15, 3, 87]
i = 0
for s in step:
   i += s
   #code...

为了证明这行得通,我们可以做一个更容易理解的例子:

step = [0, 1, 2, 4, 1]
l = [5, 6, 3, 6, 2, 7, 3, 1, 8]
i = 0
for s in step:
   i += s
   print(i, l[i])

outputs:

0 5
1 6
3 6
7 1
8 8

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    有一个简单的解决方案:

    for pkt in [raw_pkt[i] for i in step]:
        print pkt
    

    step = [0,1,2,15,3,87]
    

    raw_pkt = [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199]
    

    结果是

    100
    101
    102
    115
    103
    187
    

    【讨论】:

    • 从技术上讲,这并不能满足 OP 的要求,似乎他们想要的是 indexes,而不是 values来自raw_pktlist...
    • 另外,您可以将list-comprehension: [raw_pkt[i] for i in step] 更改为更高效generator。即(raw_pkt[i] for i in step).
    • 索引已经在step 中 - 除非step 包含您希望索引在raw_pkt 中的值,在这种情况下,只需将 foor 循环从 for pkt in [raw_pkt[i] for i in step] 更改为 for pkt_idx in [raw_pkt.index(i) for i in step]
    • 我理解这个问题的方式,这些是step indexes 之间,所以一个普通的rangefor i in range(10) 会有一个@ 987654342@list[1, 1, 1, ...]
    • 可能。这就是 OP 必须更具体的地方。如果这是他想要的,那我也同意你的回答。
    【解决方案4】:
    step = [0,1,2,15,3,87] #values in no order for i in range(0, len(raw_pkt), step):
    
    laststp = 0
    
    for stp in step:
       for i in range(stp-laststp, len(raw_pkt), stp):
          #do something
          laststp = stp
          break #this should make sure that each step is applied once.
    

    【讨论】:

    • 您是否忘记在for-loop 的开头定义laststp?因为目前不会运行,因为 laststp 未定义(以及 raw_pkt 但我假设您将其留给 OP)
    • 是的,你是对的
    猜你喜欢
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 2021-09-26
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多