Reputation: 85
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
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
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
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