2017-08-06 218 views
1

我有一个数字列表,我想遍历所有这些列表并做下面的计算。在跳过数值的同时跳过python中的列表

将这些值中的每一个都加到load demand并从available power中减去。我的代码迭代到某个点并停止计算。

num = [5,2,1,2,8,1,2] 

Pa = 130   #available power 
Ld = 100   #total load demad 
Pn = 0    #new power request 
node =0 

for number in num: 
    Pa -= num[node] 
    Ld += num[node] 
    if Pa >= Ld: 
     Pna = Pa 
     Lnd = Ld 
     Pn += num[node] 

     #print "new added value is : ", Pn 
    node += 1 

print "Available power : ", Pna 
print "Demand power : ", Lnd 

输出是

Available power : 120 
Demand power : 110 

这迭代到第5个元素停,我想保持迭代从6元,而跳过Pa >= Ld变为假值。

我是Python新手,所以我的编码结构可能不好。有没有一种方法可以使用forif循环或其他方法来满足我的要求?

在此先感谢

+6

是什么让你觉得它停止迭代?你在每次迭代时递减'Pa'并增加'Ld';因为'num'只包含正数,所以一旦'Pa> = Ld'为假,那个'if'语句的主体将永远不会再执行。在循环完成后查看'Pa','Ld'和'node'的值。 – chepner

+0

此代码是否正确缩进? – kouty

+0

是的,这就是我想要了解的。我想继续迭代,同时跳过'Pa> = Ld'变成虚假的值 – Sachith

回答

2

在验证当前节点值是否可接受之前,您不应修改PaLd

num = [5, 2, 1, 2, 8, 1, 2] 

Pa = 130   #available power 
Ld = 100   #total load demad 
Pn = 0    #new power request 

for node in num: 
    temp_Pa = Pa - node 
    temp_Ld = Ld + node 
    if temp_Pa >= temp_Ld: 
     Pa = temp_Pa 
     Ld = temp_Ld 
     Pn += node 
     print(node, 'ok', Pn, Pa, Ld) 
    else: 
     print('skipping', node) 

print("Available power : ", Pa) 
print("Demand power : ", Ld) 

输出

5 ok 5 125 105 
2 ok 7 123 107 
1 ok 8 122 108 
2 ok 10 120 110 
skipping 8 
1 ok 11 119 111 
2 ok 13 117 113 
Available power : 117 
Demand power : 113 
+0

这为我工作,并满足我的情况。谢谢。 – Sachith

+0

你可以抛开临时工,只使用 - '如果Pa-node> = Ld + node' – droravr

+2

@droravr我们可以做到这一点,但是如果条件为真,我们需要重新计算这些值。 'Pa-node'创建一个整数对象,将该对象绑定到一个名字以备后用,比重新进行算术要便宜。这不是什么大问题,但我更喜欢让我的代码更高效,除非这样做会使它过于混乱。当然,在我们需要对其进行优化的情况下,有点混乱是可以接受的。 ;) –

2

你的迭代不停止,只有你在if语句条件变得False

尽管如此,你可以用这个

for node, number in enumerate(num): 
    Pa -= num[node] 
    Ld += num[node] 
    if Pa >= Ld: 
     Pna = Pa 
     Lnd = Ld 
     Pn += num[node] 

     #print "new added value is : ", Pn 

替换代码

node =0 

for number in num: 
    Pa -= num[node] 
    Ld += num[node] 
    if Pa >= Ld: 
     Pna = Pa 
     Lnd = Ld 
     Pn += num[node] 

     #print "new added value is : ", Pn 
    node += 1 

的这部分不是手动增加node指数。 enumerate()函数将为你做。

更好的解决方案然而

for number in num: 
    Pa -= number 
    Ld += number 
    if Pa >= Ld: 
     Pna = Pa 
     Lnd = Ld 
     Pn += number 

     #print "new added value is : ", Pn 

Python是不是C语言,你不需要使用索引列表中的访问项目。

1

把一丝print声明你的循环是这样的:

Pa -= num[node] 
Ld += num[node] 
print "Node",node, "Pa=", Pa, "Ld=",Ld 

在第5迭代它打印

Node 4 Pa= 112 Ld= 118 
Node 5 Pa= 111 Ld= 119 
Node 6 Pa= 109 Ld= 121 

在节点4处试验Pa >= LdFalse。从跟踪中可以看到,尽管您的代码更改了这些值,但它们不会对它们进行更改,从而不会影响if -test,因此if内的代码将不会在剩下的迭代中执行。