2017-09-15 82 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作爲變量的名稱。