List Of Lists Of Tuples, Group By First Element And Add Second Elements
Let's say I have the following list of lists of tuples: tuples = [ [ ('2017-04-11', '2000000.00'), ('2017-04-12', '1000000.00'),
Solution 1:
The solution using itertools.chain.from_iterable
, itertools.groupby
and sum
functions:
import itertools, operator
tuples = [
[('2017-04-11', '2000000.00'), ('2017-04-12', '1000000.00'), ('2017-04-13', '3000000.00')],
[('2017-04-12', '472943.00'), ('2017-04-13', '1000000.00')]
]
result = [(k, "%.2f" % sum(float(t[1]) for t in g))
for k,g in itertools.groupby(sorted(itertools.chain.from_iterable(tuples)), operator.itemgetter(0))]
print(result)
The output:
[('2017-04-11', '2000000.00'), ('2017-04-12', '1472943.00'), ('2017-04-13', '4000000.00')]
Solution 2:
First, flat a list of tuples out of a list of lists of tuples, and then use itertools.groupby
,
import itertools
import operator
lists = [
[('2017-04-11', '2000000.00'), ('2017-04-12', '1000000.00'), ('2017-04-13', '3000000.00')],
[('2017-04-12', '472943.00'), ('2017-04-13', '1000000.00')]
]
# Step 1: Flat a list of tuples outof a list of lists of tuples
list_tuples = [t for sublist in lists for t in sublist]
'''
[('2017-04-11', '2000000.00'), ('2017-04-12', '1000000.00'), ('2017-04-13', '3000000.00'), ('2017-04-12', '472943.00'), ('2017-04-13', '1000000.00')]
'''
# Step 2: Groupby
results = list()
for key, groupin itertools.groupby(sorted(list_tuples), operator.itemgetter(0)):
s =sum(float(t[1]) for t ingroup)
results.append((key, s))
print(results)
#[('2017-04-11', 2000000.0), ('2017-04-12', 1472943.0), ('2017-04-13', 4000000.0)]
Solution 3:
My way is to convert the nested list to flat list and iterate it:
t = [
[('2017-04-11', '2000000.00'), ('2017-04-12', '1000000.00'), ('2017-04-13', '3000000.00')],
[('2017-04-12', '472943.00'), ('2017-04-13', '1000000.00')]
]
a={}
for i,j insum(t,[]):
a[i]=a[i]+float(j) if i in a elsefloat(j)
print(a)
Output:
{'2017-04-11': 2000000.0, '2017-04-13': 4000000.0, '2017-04-12': 1472943.0}
If you want a list, you can use [(k,v) for k,v in a.items()])
Solution 4:
Flattening the list then using defaultdict:
from collections import defaultdict
flattened_tuples = [item for sublist in tuples for item in sublist]
result= defaultdict(float)
fordate, valuein flattened_tuples:
result[date] +=float(value)
print(result)
returns
{'2017-04-11': 2000000.0, '2017-04-12': 1472943.0, '2017-04-13': 4000000.0}
Post a Comment for "List Of Lists Of Tuples, Group By First Element And Add Second Elements"