如何通过理解来替换for循环

时间:2017-04-11 13:16:04

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

我有state_array功能。如果if状态为真,我将从列表result中删除项目。它不起作用,因为for-loop超出了范围。 我想解决它,并且想问一下,有可能有列表理解而不是'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

2 个答案:

答案 0 :(得分:1)

这里你有太多的逻辑,以便做一个干净的列表理解。我并不是说不可能将它全部包含在列表理解中,我说它会非常难看。要防止超出范围错误,只需用枚举(结果)替换范围(len(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

答案 1 :(得分:1)

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

    FIRDatabaseReference *reference = YOUR_REF;

        NSDictionary *values = [NSDictionary dictionaryWithObjectsAndKeys:
    self.textField.text,SOME_NAME"KEY",                                                                                                                                                                                    nil];

[reference updateChildValues:values withCompletionBlock:^(NSError *__nullable err, FIRDatabaseReference * ref){
                                                                   if(err) {
                                                                       NSLog(@"Error save");
                                                                       return;
                                                                   }
                                                                   NSLog(@"Saved seccessfully in FireBace db");
                                                               }];