2014-10-29 30 views
0

我想按列表中的列表进行分组。下面的列表给出:按地名分组在python中

{'San Antonio,TX': [[-50,98],2, 3]} 

更精确地在输出内部列表的第一个元素必须要么2个第一元素:

[[[-50,98],1,2,'San Antonio,TX'],[[-52,99],3,4,'San Antonio,TX']] 

我期待的输出在下面给出。输出中内部列表的第二个元素是输入内部列表中第二个元素的平均值。输出中内部列表的第三个元素是输入内部列表中第三个元素的平均值。

这实际上是一个问题的小版本。我拥有的名单的初始名单将有1000或更多的名单。

感谢

+0

是平均截断为int或浮点数? – 2014-10-29 06:52:47

+0

截断为floats..I的平均投入INT在此,为了便于理解 – 2014-10-29 06:53:54

回答

0

test.py内容

from itertools import groupby 
from operator import itemgetter 


def aggregate(data): 
    result = [] 
    data = sorted(data, key=itemgetter(3)) 
    for k, g in groupby(data, itemgetter(3)): 
     g = list(g) 
     n = len(g) # Cast to float if you want average to be float in python 2 
     x1 = g[0][0] 
     x2 = sum(x[1] for x in g) 
     x3 = sum(x[2] for x in g) 
     d = {k: [x1, x2/n, x3/n]} # This is what you want for each group 
     result.append(d) 

    return result 


def main(): 
    data = [[[-50,98], 1, 2, 'San Antonio,TX'], 
      [[-52,99], 3, 4, 'San Antonio,TX']] 
    result = aggregate(data) 
    print(result) 

if __name__ == '__main__': 
    main() 

结果:

In [12]: run test.py 
[{'San Antonio,TX': [[-50, 98], 2, 3]}] 
+0

非常感谢..感谢您的帮助 – 2014-10-29 07:25:20

+0

@YEDURAGBABU如果这个答案是正确的,通过点击“嘀”在考虑将其标记为答案下方的数字左边距,甚至提升它。 – lightalchemist 2014-10-29 07:56:39