簡體   English   中英

在列表列表中的2個鍵上的python組,並對每個列表中的2個不同的值求和

[英]python group on 2 keys in a list of lists and sum on 2 different values in each list

給定一個列表列表:

d = [['a', 'x', 10.5, 5 ],['a', 'x',  6.5, 4 ],['b', 'x',  4.0, 3 ],['b', 'x',  2.0, 2 ],['b', 'z',  5.5, 4 ]]; 

我努力了:

for key, rows in groupby(data, lambda x: (x[0], x[1])): 
        print (key, sum (r[2] for r in rows), sum (r[2] for r in rows) )

但是得到:

('a', 'x') 17.0 0
('b', 'x') 6.0 0
('b', 'z') 5.5 0

如何獲取列表的列表,該列表在第一個2個元素上分組,並在最后兩個float和int的每個元素上求和以得到:

[['a', 'x', 17.0, 9], ['b', 'x', 6.0 , 5],['b', 'z', 5.5 , 4]]

只需存儲groupby返回的迭代器,以便可以對其進行多次迭代:

from itertools import groupby

d = [['a', 'x', 10.5, 5 ],['a', 'x',  6.5, 4 ],['b', 'x',  4.0, 3 ],
     ['b', 'x',  2.0, 2 ],['b', 'z',  5.5, 4 ]]

for key, rows in groupby(d, lambda x: (x[0], x[1])):
    rows = tuple(rows)
    print (key, sum (r[2] for r in rows), sum(r[3] for r in rows))

輸出:

(('a', 'x'), 17.0, 9)
(('b', 'x'), 6.0, 5)
(('b', 'z'), 5.5, 4)

groupby產生(key, iterator)元組,並且該迭代器只能迭代一次。 您的代碼嘗試執行兩次操作,因此第二次嘗試不執行任何操作,結果sum0

當然,您可以只使用列表推導,這將允許您跳過存儲部分:

[reduce(lambda x,y: k + map(sum, zip(x[2:],y[2:])), g) 
 for k, g in groupby(d, lambda x: x[:2])]

# [['a', 'x', 17.0, 9], ['b', 'x', 6.0, 5], ['b', 'z', 5.5, 4]]

列表理解的另一種選擇:

from itertools import groupby

[k + [sum(r) for i, r in enumerate(zip(*g)) if i >= 2] for k, g in groupby(d, key = lambda x: x[:2])]

# [['a', 'x', 17.0, 9], ['b', 'x', 6.0, 5], ['b', 'z', 5.5, 4]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM