Вы можете производить кортежи, которые имеют один номер либо в False
позиции или True
позиции в списке понимания или генератора exrpession:
>>> [(e,0) if c=='False' else (0,e) for e, c in zip(rts, inControl)]
[(379, 0), (396, 0), (0, 480), (0, 443), (365, 0), (0, 280), (487, 0), (0, 446), (0, 350), (367, 0), (405, 0), (391, 0), (484, 0), (359, 0), (367, 0), (0, 305), (359, 0), (0, 479), (436, 0), (333, 0)]
You можно просуммировать ряд кортежей с reduce
:
>>> reduce(lambda x, y: (x[0]+y[0], x[1]+y[1]), (((e,0) if c=='False' else (0,e) for e, c in zip(rts, inControl))))
(5128, 2783)
Вы можете использовать False
и True
булевы для доступа к кортежу:
>>> t=reduce(lambda x, y: (x[0]+y[0], x[1]+y[1]), ((e if c=='False' else 0, e if c=='True' else 0) for e, c in zip(rts, inControl)))
>>> t[False]
5128
>>> t[True]
2783
Или, вы можете использовать map
, если это имеет смысл для вас:
>>> map(sum, zip(*((e,0) if c=='False' else (0,e) for e, c in zip(rts, inControl))))
[5128, 2783]
Или, вы можете создать Dict с суммами:
>>> dict(zip([False, True], map(sum, zip(*[(e,0) if c=='False' else (0,e) for e, c in zip(rts, inControl)]))))
{False: 5128, True: 2783}
Если у вас есть панда, отличный способ сделать это с .groupby()
и sum
:
>>> import pandas as pd
>>> df=pd.DataFrame({'rts':rts, 'inControl':inControl})
>>> df
inControl rts
0 False 379
1 False 396
2 True 480
3 True 443
4 False 365
5 True 280
6 False 487
7 True 446
8 True 350
9 False 367
10 False 405
11 False 391
12 False 484
13 False 359
14 False 367
15 True 305
16 False 359
17 True 479
18 False 436
19 False 333
>>> df.groupby(inControl).sum()
rts
False 5128
True 2783
Посмотрите на 'itertools' и специально на' groupby'. См. Документы [здесь] (https://docs.python.org/2/library/itertools.html#itertools.groupby) –
@TammoHeeren: для 'groupby':« Как правило, итерабельность должна быть уже отсортирована на той же ключевой функции ". Здесь нужно отсортировать кортежи. –
@ Jean-FrançoisFabre Хороший комментарий. Вы абсолютно правы. Должен быть отсортирован на 'inControl' здесь. –