2017-09-15 113 views
0

我有一个列表如下图所示:Python列表组,名称

list=[['BMW Z4', 'TEST', 18, '2016-09-26'], 
['BMW Z4', 'TEST', 144, '2014-10-30'], 
['BMW 335i', 'TEST', 144, '2013-09-26'], 
['BMW 335i', 'TEST', 360, '2014-08-31'], 
['BMW 335i', 'TEST', 360, '2017-08-31'], 
['BMW 550xd', 'TEST', 18, '2016-10-30'], 
['BMW 550xd', 'TEST', 36, '2014-10-30']] 

我试图创建:

list2=[['BMW Z4', 'TEST', 162, '2016-09-26','2014-10-30'], 
['BMW 335i', 'TEST', 864, '2017-08-31','2013-09-26'], 
['BMW 550xd', 'TEST', 54, '2016-10-30','2014-10-30']] 
  • 1)名单是由第一个元素分组
  • 2)数量是总和(第三元件)
  • 3)新的列被添加所述元件是蝾螈日期和第五 是最老的一个。

你有什么建议,我可以如何使用Python函数得到像list2这样的表吗?

+2

值'TEST'的目的是什么? – floatingpurr

回答

2

您可以使用itertools.groupby()

from itertools import groupby 

lst = [['BMW Z4', 'TEST', 18, '2016-09-26'], 
     ['BMW Z4', 'TEST', 144, '2014-10-30'], 
     ['BMW 335i', 'TEST', 144, '2013-09-26'], 
     ['BMW 335i', 'TEST', 360, '2014-08-31'], 
     ['BMW 335i', 'TEST', 360, '2017-08-31'], 
     ['BMW 550xd', 'TEST', 18, '2016-10-30'], 
     ['BMW 550xd', 'TEST', 36, '2014-10-30']] 

lst2 = [] 

for k, g in groupby(lst, lambda x: x[0]): 
    g = list(g) 
    lst2.append([k, "TEST", sum(x[2] for x in g), max(x[3] for x in g), 
       min(x[3] for x in g)]) 
print(lst2) 

输出:

[['BMW Z4', 'TEST', 162, '2016-09-26', '2014-10-30'], 
['BMW 335i', 'TEST', 864, '2017-08-31', '2013-09-26'], 
['BMW 550xd', 'TEST', 54, '2016-10-30', '2014-10-30']] 
2

你可以用大熊猫做这个

import pandas as pd 

list1=[['BMW Z4', 'TEST', 18, '2016-09-26'], 
     ['BMW Z4', 'TEST', 144, '2014-10-30'], 
     ['BMW 335i', 'TEST', 144, '2013-09-26'], 
     ['BMW 335i', 'TEST', 360, '2014-08-31'], 
     ['BMW 335i', 'TEST', 360, '2017-08-31'], 
     ['BMW 550xd', 'TEST', 18, '2016-10-30'], 
     ['BMW 550xd', 'TEST', 36, '2014-10-30']] 

result = pd.DataFrame(list1).groupby(0, as_index=False).agg({1:'first', 2:'sum', 3:['max', 'min']}).values 

print(result) 

,这将给你:

[['BMW 335i' 'TEST' 864 '2017-08-31' '2013-09-26'] 
['BMW 550xd' 'TEST' 54 '2016-10-30' '2014-10-30'] 
['BMW Z4' 'TEST' 162 '2016-09-26' '2014-10-30']] 

(注意你不应该命名您的变量“列表”,因为这将覆盖内置式)

+0

为了避免重置索引,您可以将'as_index = False'传递给'groupby'。 – miradulo

+1

@Mitch谢谢,我总是忘记这个选择,已经做出了改变 –

1

您还可以使用pandas

import pandas as pd 
import numpy as np 

df = pd.DataFrame(l) 

      0  1 2   3 
0  BMW Z4 TEST 18 2016-09-26 
1  BMW Z4 TEST 144 2014-10-30 
2 BMW 335i TEST 144 2013-09-26 
3 BMW 335i TEST 360 2014-08-31 
4 BMW 335i TEST 360 2017-08-31 
5 BMW 550xd TEST 18 2016-10-30 
6 BMW 550xd TEST 36 2014-10-30 


l2 = df.groupby(0).agg({1: 'first', 2:np.sum, 3: [np.max, np.min]}).reset_index().values.tolist() 

l2 

[['BMW 335i', 'TEST', 864, '2017-08-31', '2013-09-26'], 
['BMW 550xd', 'TEST', 54, '2016-10-30', '2014-10-30'], 
['BMW Z4', 'TEST', 162, '2016-09-26', '2014-10-30']] 

另外,不要打电话给你的清单,list

1

您可以使用defaultdict

from collections import defaultdict 

data = [ 
    ['BMW Z4', 'TEST', 18, '2016-09-26'], 
    ['BMW Z4', 'TEST', 144, '2014-10-30'], 
    ['BMW 335i', 'TEST', 144, '2013-09-26'], 
    ['BMW 335i', 'TEST', 360, '2014-08-31'], 
    ['BMW 335i', 'TEST', 360, '2017-08-31'], 
    ['BMW 550xd', 'TEST', 18, '2016-10-30'], 
    ['BMW 550xd', 'TEST', 36, '2014-10-30'], 
] 

d = defaultdict(lambda: {'sum': 0, 'dates': set()}) 
for row in data: 
    d[row[0]]['sum'] += row[2] 
    d[row[0]]['dates'].add(row[3]) 

result = [ 
    [key, 'TEST', value['sum']] + sorted(value['dates'], reverse=True) 
    for key, value in d.items() 
] 

顺便说一句,这不是去od使用list作为变量的名称。