如何将列表的索引与浮点数进行比较?

时间:2015-11-03 19:48:28

标签: python

要迭代的嵌套列表

cost =[[125900], [115000],
[105900],
[85000],
[150000],
[155249],
[97500]]

初始化变量

index = 0
cost_len = len(cost)
below_avg = 0
above_avg = 0
total = 0

用于循环计算成本中所有元素的总和

 for i in cost:
    total = total + sum(i)
    print(total)

计算成本的平均值

avg = total / len(cost)

尝试计算指数是高于还是低于平均值

for i in cost:
    while index <= cost_len:
        if i > avg:
            above_avg+=1
        elif i < avg:
            below_avg +=1
        index+=1

当试图评估成本指数时,它会返回&#34; TypeError:不可解决的类型:list()&gt;浮动()&#34 ;.如何将列表的索引与变量avg进行比较?

3 个答案:

答案 0 :(得分:1)

假设每个子列表中有一个元素,flatten似乎是最好的:

flat_cost = [x[0] for x in cost]
total = sum(flat_cost)
avg = total /len(cost)
above = len([x for x in flat_cost if x > avg])
below = len([x for x in flat_cost if x < avg])

答案 1 :(得分:0)

如果您打算处理数字列表或数字数组,那么我建议您使用Numpy(http://docs.scipy.org/doc/numpy/user/index.html)完成此任务:

import numpy as np

cost = np.array([[125900],
 [115000],
 [105900],
 [85000],
 [150000],
 [155249],
 [97500]])

cost-np.average(cost)

>>>array([[  6678.71428571],
       [ -4221.28571429],
       [-13321.28571429],
       [-34221.28571429],
       [ 30778.71428571],
       [ 36027.71428571],
       [-21721.28571429]])

cost - np.average(cost)是一种使用Numpy广播功能的方法。你可以从一个数组(np.average(cost))中减去一个值(cost),它将为整个数组做减法,为你提供答案数组。

答案 2 :(得分:0)

如果要比较每个子列表中的多个元素,则无需展平列表:

total = sum(sum(x) for x in cost)
cost_len = sum(len(x) for x in cost)
avg = total / cost_len
above = sum([sum([y > avg for y in x for x in cost])])
below = sum([sum([y < avg for y in x for x in cost])])
exact = cost_len - (above + below)

有关此解决方案的几点意见:

  1. totalcost_len的计算使用生成器,而不是从结果中创建列表。这节省了一些内存和可能的执行时间,因为中间结果不需要额外的存储空间。
  2. abovebelow是嵌套的生成器,基本上等同于您尝试执行的嵌套循环。
  3. 以下是对最终嵌套循环的作用以及解决方法的解释:

    for i in cost:
        while index <= cost_len:
            if i > avg:
                above_avg+=1
            elif i < avg:
                below_avg +=1
            index+=1
    

    i遍历cost的元素,但内部while循环阻止它在处理i的第一个值后执行任何操作。请注意,i的值在内部循环中不会发生变化,因此对第一个i进行一次又一次的比较,而对其他index则完全没有,因为cost_len + 1将是那时for i in cost: for j in i: if j > avg: above_avg+=1 elif j < avg: below_avg +=1 。要保留双循环结构,可以执行以下操作:

    index

    此时,您确实不需要... [ strNADPplus ] 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 11153 11154 11155 11156 11157 11158 11159 11160 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 12964 12965 12966 12967 12968 12969 12970 5360 13057 13058 13059 13060 13061 13062 13063 13064 13065 13066 13067 13068 13069 13070 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 13110 13111 13112 13113 13114 13115 13116 13117 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 13173 13174 13175 13176 13177 13178 13179 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 13557 13558 13559 13560 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 13683 13684 13685 13686 6021 6022 6023 6024 6025 6026 6027 6028 6029 13718 13719 13720 13721 13722 13723 6339 6340 6341 6342 6343 6344 6345 6346 6347 14044 14045 14046 14047 14048 14049 ...