askpython
askpython

Reputation: 85

python - sum the numbers if the previous variable was the same as exiting elements in alist

i have alist within alist that looks like that:

sub_count = [[['Farm', u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Premium'], 2], [['Farm', u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Standard'], 2], [['Farm', u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Premium'], 1]]

what i need to get anew dictionary with farm as akey ,and lists of subscription name

i.e Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Premium/standard ,and the summary of subscriptions per subscriptions

example:

dic = {Farm:[Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Premium,3][Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Standard,2]}

Note: i have tried to create a new list and try the below method to get my result as alist but not getting the correct result and i actually prefer adict:

['Farm', u'Red Hat Enterprise Linux for Virtual Datacenters with Smart 
Management, Premium', 2, 'Farm', u'Red Hat Enterprise Linux for Virtual 
Datacenters with Smart Management, Standard', 2, 'Farm', u'Red Hat Enterprise 
Linux for Virtual Datacenters with Smart Management, Premium', 1]


list2 = []
for i in list1:
    if i not in list2:
        if not isinstance(i, (int, long)):
            list2.append(i)
        if isinstance(i, (int, long)):
            count = 0
            count = count + i:
            list2.append(count)

getting:

['Farm', u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Premium', 2, u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Standard', 1]

Please provide a way to get the dic as the example above

Upvotes: 0

Views: 51

Answers (3)

Espoir Murhabazi
Espoir Murhabazi

Reputation: 6386

I have done this :

a_dict =defaultdict(dict)
for x in sub_count:
    if a_dict[x[0][0]].get(x[0][1]):
        a_dict[x[0][0]][x[0][1]] += x[1]
    else:
        a_dict[x[0][0]][x[0][1]] = x[1]

Here is the output :

defaultdict(dict,
            {'Farm': {u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Premium': 3,
              u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Standard': 2}})

Upvotes: 0

Ajax1234
Ajax1234

Reputation: 71461

You can use itertools.groupby:

import itertools
sub_count = [[['Farm', u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management', 'Premium'], 2], [['Farm', u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management', 'Standard'], 2], [['Farm', u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management', 'Premium'], 1]]
final_data = {a:[zip(*list(d)) for c, d in itertools.groupby(sorted(list(b), key=lambda x:x[0][-1]), key=lambda x:x[0][-1])] for a, b in itertools.groupby(sub_count, key=lambda x:x[0][0])}
new_final_data = {a:[i[0]+[sum(c)] for i, c in b] for a, b in final_data.items()}

Output:

{'Farm': [['Farm', u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management', 'Premium', 3], ['Farm', u'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management', 'Standard', 2]]}

Upvotes: 0

tobias_k
tobias_k

Reputation: 82929

You can use a defaultdict of defaultdict of int:

from collections import defaultdict
d = defaultdict(lambda: defaultdict(int))
for (a, b), c in sub_count:
    d[a][b] += c

Result is (omitting defaultdict-specific markup for readability)

{'Farm': {'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Premium': 3, 
          'Red Hat Enterprise Linux for Virtual Datacenters with Smart Management, Standard': 2})})

Upvotes: 1

Related Questions