Python - 计算列表

时间:2017-10-27 13:31:56

标签: python list vector

我有一个列表,包括矢量集,全部有3个坐标。我需要得到一个新的列表,其中包括这些向量的相应坐标的平均值,按照他们的团队。特别是,我有一个列表(列表)列表:

list=[[[1,1,1],[0,1,0]],[[0,0,2]],[[1,1,1],[2,2,2],[2,2,1]]]

我想要的是获得以下列表:

new_list=[[1/2,1,1/2],[0,0,2],[5/3,5/3,4/3]]

来自添加list的前两个向量的相应坐标,然后除以它们的数字,即:

[(1+0)/2, (1+1)/2, (0+1)/2]

然后连接list

的第三个元素
[0,0,2]

最后添加最后3个向量的相应“坐标”并将它们除以它们的数字,即:

[(1+2+2)/3,(1+2+2)/3,(1+2+1)/3]

我已尝试使用一系列嵌套for loops执行上述操作,但我一直在忽略它并得到错误的结果。 如果我的问题是错误的,我很抱歉,但我真的找不到更好的方式来描述我的情况。

3 个答案:

答案 0 :(得分:2)

你需要拉链! 迭代输入列表,压缩子列表,然后,对于压缩结果中的每个元素,找到平均值!

>>> lis = [[[1,1,1],[0,1,0]],[[0,0,2]],[[1,1,1],[2,2,2],[2,2,1]]]
>>> centroid = lambda inp: [[sum(m)/float(len(m)) for m in zip(*l)] for l in inp]
>>> centroid(lis)
[[0.5, 1.0, 0.5], [0.0, 0.0, 2.0], [1.6666666666666667, 1.6666666666666667, 1.3333333333333333]]

解释质心函数,

>>> [zip(*l) for l in lis] #iterate through the input list and zip them to get what you call `adding the respective coordinates of the first two vectors of list`
[[(1, 0), (1, 1), (1, 0)], [(0,), (0,), (2,)], [(1, 2, 2), (1, 2, 2), (1, 2, 1)]]
>>> [[m for m in zip(*l)] for l in lis]
[[(1, 0), (1, 1), (1, 0)], [(0,), (0,), (2,)], [(1, 2, 2), (1, 2, 2), (1, 2, 1)]]
>>> [[sum(m) for m in zip(*l)] for l in lis]
[[1, 2, 1], [0, 0, 2], [5, 5, 4]]
>>> [[sum(m)/len(m) for m in zip(*l)] for l in lis]
[[0, 1, 0], [0, 0, 2], [1, 1, 1]]
>>> [[sum(m)/float(len(m)) for m in zip(*l)] for l in lis]
[[0.5, 1.0, 0.5], [0.0, 0.0, 2.0], [1.6666666666666667, 1.6666666666666667, 1.3333333333333333]]

注意:如果您使用的是python3及更高版本,则在分割时无需将整数显式转换为float()。

答案 1 :(得分:0)

这更像是一个会计问题。我建议把事情搞砸,不要试图变得花哨(只是让它起作用!)

    LinearLayout linearLayout = (LinearLayout)findViewById(xxx);
    Drawable drawable = linearLayout.getBackground();
    // do animation on drawable

答案 2 :(得分:0)

首先,我会将元组用于三元素列表,因为你不会改变它们:

l = [
     [
      (1, 1, 1),
      (0, 1, 0)
     ],
     [
      (0, 0, 2)
     ],
     [
      (1, 1, 1),
      (2, 2, 2),
      (2, 2, 1)
     ]
    ]

如果你想要一个单线程的pythonic解决方案,请选择:

print(list(map(lambda *args: sum(args)/len(args), *(map(lambda *args: sum(args)/len(args), *item) for item in l))))

也可以使用函数定义而不是lambda来完成它的两次使用:

def mean(*args):
    return sum(args)/len(args)

print(list(map(mean, *(map(mean, *item) for item in l))))

正如您所看到的,解决方案是使用lambda /函数来计算传递的参数的平均值。它还使用生成器和map

让我们一步一步地看到它:

for items in (map(mean, *item) for item in l):
    print(list(items))
# [0.5, 1.0, 0.5]
# [0.0, 0.0, 2.0]
# [1.66666667, 1.666666667, 1.33333333]
step_1 = (map(mean, *item) for item in l)
step_2 = map(mean, *step_1)
print(list(step_2))

在第一步中,我们为列表中的每个元素创建一个生成器(将其视为一个只能使用一次的内存高效数组),*正在提取第二级列表并将它们作为多个参数传递给函数映射。所以基本上map在第一次迭代中接收map(mean, (1,1,1), (0,1,0))。 Map函数在元组中每个元素调用一次mean函数,从每个元组传递一个元素:mean(1,0)mean(1,1)mean(1,0)然后将它们分组到一个地图对象中,你可以认为是与发电机相同。并记住所有这些都是针对列表第一级中的每个元素完成的。所以我们有一个生成器,它将生成3个地图对象:一个包含mean(1,0)mean(1,1)mean(1,0);第二个包含mean(0)mean(0)mean(2),最后一个包含mean(1,2,2)mean(1,2,2)mean(1,2,1)

第二步是再次使用相同的map expresion应用相同的函数,以便我们获得一个地图对象:mean(mean(1,0),mean(0),mean(1,2,2))mean(mean(1,1),mean(0),mean(1,2,2))mean(mean(1,0),mean(2),mean(1,2,1))。通过forcinf转换为列表,我们可以在控制台中打印它。

lambda版本与exaclty相同但具有匿名函数。

如果您使用的是Python 2.7,则需要为len(args)更改float(len(args))(2次冒充lambda版本,在def版本中只有一次。