我有一个列表,包括矢量集,全部有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
执行上述操作,但我一直在忽略它并得到错误的结果。
如果我的问题是错误的,我很抱歉,但我真的找不到更好的方式来描述我的情况。
答案 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版本中只有一次。