2015-11-03 101 views
1

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

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

初始化变量

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

for循环来计算成本

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 

当试图评价成本的索引,则返回“类型错误:unorderable类型:列表()>浮动()”。我如何比较列表的指数和变量avg?

+0

在上一个代码位中,什么是'index','cost_len','above_avg','below_avg'?它们从未被显示为被初始化。 –

+0

不用担心。我收回了我的近距离投票。 –

回答

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是嵌套的生成器,基本上等同于您尝试执行的嵌套循环。

这是一个什么样的最终嵌套循环原理,以及如何解决它的解释:

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

1

假设每个子列表中的一个元素,扁平化似乎是最好的:

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]) 
+0

对于每个列表中的任意数量的元素,您可以将[j替换为j中的i,代表i中的i] – BlivetWidget

+0

谢谢,非常干净,正是我所期待的。 –

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),它会对整个数组进行减法运算,从而为您提供答案数组。

+0

这不是我正在寻找的,但我会尝试用Numpy来解决它以熟悉模块,谢谢。 –