Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中反转循环?_Python_List_For Loop - Fatal编程技术网

在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)]