2017-08-11 82 views
0

試圖在Python中執行條件和產品。簡化的想法如下:Itertools Groupby循環播放不同列

A = [1 1 2 3 3 3] 
B = [0.50 0.25 0.99 0.80 0.70 0.20] 

我想有作爲輸出

Total1 = 0.50*1 + 0.25*1 
Total2 = 0.99*2 
Total3 = 0.80*3 + 0.70*3 + 0.20*3 

人們在這裏感謝支持,這部分的工作了!

我喜歡添加的下一個函數,能夠爲不同的列'B'(比如B1,B2,B3,...)(具有不同的值)計算此值。 這些都存儲在Excel中,我用openpyxl將它們讀出到不同的列表中(可能會更有效......) 這意味着B1/B2/...中的值與A中的相應值相對應。

number = -1 
j = 0 
for col in ws.iter_cols(): 
    if col[3].value == "fast" : 
     number = j 
    j+=1 

B1 = [row[number].value for row in ws.iter_rows(min_row=5, max_row=63332) ] 
B1_float = [float(i) for i in B1] 

是否有執行this腳本以不同的組合方式(A & B1/A & B2/A & B3/...)並將它們存儲在一個矩陣? (或excel文件)

我希望這很清楚我的意思,如果沒有,請告訴我!

+0

請不要忘記添加「如何」這些不同的值存儲或使用'openpyxl'迭代。即你如何獲取和接收列? – MSeifert

+0

好吧,我編輯進一步解釋:) –

回答

1

您似乎在問兩個問題:

  1. 基於組從一個單獨的列表
  2. 寫這些結果到Excel文件

由於這些是完全不同的產品計算總和問題,我會解決第一個問題,並參考第二個問題。

import operator as op 
import itertools as it 
import functools as ft 


A = [1, 1, 2, 3, 3, 3] 
B = [0.5, 0.25, 0.99, 0.8, 0.7, 0.2] 

groups = [list(g) for k, g in it.groupby(zip(A, B), op.itemgetter(0))] 
groups 
# [[(1, 0.5), (1, 0.25)], [(2, 0.99)], [(3, 0.8), (3, 0.7), (3, 0.2)]] 

在這裏我們將數據列壓縮並根據列表A進行分組。現在我們可以在groups的每個迭代中應用適當的運算符。

[sum(ft.reduce(op.mul, i) for i in sub) for sub in groups] 
# [0.75, 1.98, 5.1] 

至於將數據寫入到Excel中,有several Python libraries,每個都有關於如何做到這一點的文檔。