在python中反转循环?
我不确定我的标题是否正是我想要做的,但本质上我得到的是列表的平均值,我希望它不是添加到列表中,而是添加到列表中:在python中反转循环?,python,list,for-loop,Python,List,For Loop,我不确定我的标题是否正是我想要做的,但本质上我得到的是列表的平均值,我希望它不是添加到列表中,而是添加到列表中: listoflists = [[1,2,3], [1,0,4], [0,5,1]] #want [1, 3.5, 2.67] final = [] for i in range(len(listoflists)): count = 0 val = 0 for j in range(len(listoflists[i])): if listofl
listoflists = [[1,2,3], [1,0,4], [0,5,1]]
#want [1, 3.5, 2.67]
final = []
for i in range(len(listoflists)):
count = 0
val = 0
for j in range(len(listoflists[i])):
if listoflists[i][j] != 0:
count += 1
val += listoflists[i][j]
final.append(float(val)/count)
print final #currently returns [2.0, 2.5, 3.0]
我希望它添加1、1、0(每个列表中的第一个值)并获得2/2=1(如果为0,则不计算它),而不是添加1、2、3并获得平均值6/3=2
如何让循环执行此操作?您可以先使用zip转换列表
zip(*listoflists)
>>> [(1, 1, 0), (2, 0, 5), (3, 4, 1)]
这里有一种方法:
final = []
for l in zip(*listoflists):
final.append(float(sum(l)) / len([x for x in l if x != 0]))
print final
你可以用NumPy
arr = np.array(listoflists)
sums = arr.sum(axis=0)
final = []
for i in range(arr.shape[1]):
final.append(sums[i]/np.count_nonzero(arr[:,i])
或者最好是完全避免循环
arr = np.array(listoflists)
sums = arr.sum(0)
non_zeros = (arr != 0).sum(0)
final = sums / zon_zeros
这将对您有用:
listoflists = [[1,2,3], [1,0,4], [0,5,1]]
second_list = zip(*listoflists)
new_list = map(list, second_list)
final_list = []
without_zero = []
for i in new_list:
for b in i:
if b != 0:
without_zero.append(b)
final_list.append(without_zero)
without_zero = []
average = [sum(i)/float(len(i)) for i in final_list]
print average
编辑:
使用列表理解和zip的另一种方法:
listoflists = [[1,2,3], [1,0,4], [0,5,1]]
new_list = zip(*listoflists)
result = [sum([i for i in b if i != 0])/float(len([i for i in b if i != 0])) for b in new_list]
print result
来自未来进口部的
映射(lambda*列:总和(列)/总和(x>0表示列中的x),*列表)
另一种可能性(仅限Python 3):
可选的numpy实现(也适用于Python 2):
让我们将您的代码改造成更像Python的代码。在Python中,我们可以迭代(遍历列表)并直接返回对象,实际上不需要使用索引
final = []
for i in listoflists:
count = 0
val = 0
for j in i:
if j != 0:
count += 1
val += j
final.append(float(val)/count)
print final
此代码与您的代码完全相同,没有索引,j
是我们得到的实际子项(数字)
为了满足您的需要,Python提供了一个方便的函数,可以转换子列表。例如,如果我们有以下列表,当我们
zip([1,2],[3,4])
这些列表时,我们得到[(1,3)、(2,4)]
我们可以通过在列表之前使用*
符号来解压列表,从而实现您想要的功能,zip()
支持此功能。回到上一个示例,我们可以制作一个列表x=[[1,2],[3,4]]
,并将x与*
一起传递到zip中,以获得我们想要的内容zip(*x)
我们将获得[(1,3)、(2,4)]
。把这些和你所拥有的结合在一起,你会得到你想要的结果
final = []
for i in zip(*listoflists):
count = 0
val = 0
for j in i:
if j != 0:
count += 1
val += j
final.append(float(val)/count)
我们可以通过使用更多的内置函数来改进这一点,例如,如果可能的话,它将汇总列表中的所有项目,并且您已经知道
len()
,它可以用于过滤0
。从文档中:
(如果项为iterable中的项)如果函数为None
因此,我们正在检查列表中是否包含有价值的项,并且当if 0:
final = []
for i in zip(*listoflists):
if i:
final.append(float(sum(i))/len(filter(None, i)))
print final
通过使用Python提供的最简洁的功能之一,我们可以进一步压缩函数: 注意,这些答案中的一些可能没有其他答案那么理想,但我的答案集中在只使用内置的不同方法上 使用转置列表,然后使用获取转置列表的总和。
final = []
for i in zip(*listoflists):
count = 0
val = 0
for j in i:
if j != 0:
count += 1
val += j
final.append(float(val)/count)
final = []
for i in zip(*listoflists):
if i:
final.append(float(sum(i))/len(filter(None, i)))
print final
print [float(sum(i))/len(filter(None,i)) for i in zip(*listoflists)]