【问题标题】:How to replace for-loop by comprehension如何通过理解替换for循环
【发布时间】:2017-04-11 13:16:04
【问题描述】:

我有state_array 功能。如果if 状态为真,我将从列表result 中删除项目。它不起作用,因为for-loop ist 超出范围。 我想解决它,并想问,可以有列表理解而不是'for-loop',如果是,怎么做?

def state_array(self):
    for k in range(len(result)):
        if '[0]' in str(result[k]):
            if '[7]' in str(result[k+7]) and '[8]' not in str(result[k+8]):
                result[k][0] = str(result[k][0]).replace('[0]', '').replace('X0', 'X0,8')                      # state array
                del result[k+1:k+7]
            else:
                continue

我的意见:

V;3;M_BB01_03[0];SPPP.BK1800.58,X0;RW
V;3;M_BB01_03[1];SPPP.BK1800.58,X1;RW
V;3;M_BB01_03[2];SPPP.BK1800.58,X2;RW
V;3;M_BB01_03[3];SPPP.BK1800.58,X3;RW
V;3;M_BB01_03[4];SPPP.BK1800.58,X4;RW
V;3;M_BB01_03[5];SPPP.BK1800.58,X5;RW
V;3;M_BB01_03[6];SPPP.BK1800.58,X6;RW
V;3;M_BB01_03[7];SPPP.BK1800.58,X7;RW

预期输出:

V;3;M_BB01_03[0];SPPP.BK1800.58,X0,8;RW

【问题讨论】:

  • 你能给出一些输入和预期的输出吗?如果你给出一个可以完全独立运行的代码sn-p,那么人家帮你就容易多了
  • 我更新了输入输出问题
  • 您的输入是字符串列表吗?
  • 当你的输入字符串只有8个元素时,为什么要检查第9个元素?

标签: python python-3.x loops for-loop list-comprehension


【解决方案1】:

您从 0 循环到数组的 原始 长度,但随后您更改了循环内的实际长度。对此的快速修复是使用 while 循环:

k=0
while(k<len(A)):
    if(condition)
         del(A[k])
    k=k+1

【讨论】:

    【解决方案2】:

    这里你在这个块中有太多的逻辑来做一个干净的列表理解。我并不是说不可能将其全部打包在列表理解中,我说这会非常难看。为防止出现超出范围错误,只需将 range(len(result)) 替换为 enumerate(result)。

    def state_array(self):
    for k, r in enumerate(result):
        if k+7 >= len(result):
            break
        if '[0]' in str(r):
            if '[7]' in str(result[k+7]) and '[8]' not in str(result[k+8]):
                r[0] = str(r[0]).replace('[0]', '').replace('X0', 'X0,8')                      # state array
                del result[k+1:k+7]
            else:
                continue
    

    【讨论】:

    • 它确实解决了它,因为不是迭代在循环之前创建的固定大小的范围,而是迭代实际的项目。我唯一忘记的是检查 k+7 是否不如结果的长度。
    • 因此,如果您使用产生迭代器的enumerate,如果可迭代的大小发生变化,您将不会收到 IndexError!我不知道 - 谢谢。
    • 它不工作,我有一个错误:if int(k+7) &gt;= len(result): TypeError: can only concatenate list (not "int") to list
    • 我的错,它是 k, r in enumerate(result)