Reputation: 329
Desired Dictionary Format:
foo = {'a': [{'Arizona': [Partner(state='Arizona', name='shmo', logo='123.png', link=''), Partner(state='Arizona', name='joe', logo='png', link='')] }, 'c':[{'california': [stuff, more_stuf]}]}
Dictionaries which I currently have:
The first one:
{'o': [Partner(state='Ohio', name='hi', logo='pic.png', link='http'),
Partner(state='Ohio', name='ayo', logo='int.png',)],
'a':[Partner(state='alaska', name='hi', logo='pic.png', link='http'),
Partner(state='arkansas', name='ayo', logo='int.png',)]})
The second one:
{'Ohio': [Partner(state='Ohio', name='shmo', logo='123.png',
link=''), Partner(state='Ohio', name='joe', logo='png', link='')],
'Alaska': [Partner(state='Alaska', name='yo',logo='321.png',
link='')],
'arkansas'[Partner(state='arkansas',name='yo',logo='321.png', link='')]
I even have a dict with letters that have states within!
{'i': None, 'm': 'm', 'f': None, 'j': None, 'b': None, 'p': None, 'n': None, 't': 't', 'v': None, 'k': None, 'e': None, 'g': None, 'q': None, 'h': None, 'y': None, 'c': None, 'w': None, 'a': 'a', 'u': None, 'x': None, 'l': None, 'o': 'o', 'd': None, 'z': None, 's': None, 'r': None}
And even a list!
dict_keys(['a', 'm', 'o', 't'])
What I have tried to play around with
partners_by_states = defaultdict(list)
for partner in partner_list:
raw_state_state_name = partner.state
state_key = raw_state_state_name.lower()
partners_by_states[state_key].append(partner)
used_letters = partners_by_state.keys()
for key, value in partners_by_states.items():
partners = sorted(value, key=lambda x: x.name)
partners_by_states[state_key] = partners
Upvotes: 1
Views: 72
Reputation: 371
it is difficult for me to guess, what exact result you expect. Maybe this one?
To make it runable a simple class for "Partner"
'''
to make it run
'''
class Partner:
def __init__(self, state = None, name = None, logo = None, link = None):
self.state = state
self.logo = logo
self.name = name
self.link = link
def __str__(self):
s = ""
if self.state != None:
s += 'state = ' + str(self.state)+ ' '
if self.logo != None:
s += 'logo = ' + str(self.logo)+ ' '
if self.name != None:
s += 'name = ' + str(self.name)+ ' '
if self.link != None:
s += 'link = ' + str(self.link)+ ' '
return s
A Little beautification for your data
'''
your data with correct brackets
'''
foo = {
'a':
[
{'Arizona':
[
Partner(state='Arizona', name='shmo', logo='123.png', link=''),
Partner(state='Arizona', name='joe', logo='png', link='')
]
}
],
'c':
[
{'california':
["stuff", "more_stuf"]
}
]
}
d1 = {
'o':
[
Partner(state='Ohio', name='hi', logo='pic.png', link='http'),
Partner(state='Ohio', name='ayo', logo='int.png')
],
'a':
[
Partner(state='alaska', name='hi', logo='pic.png', link='http'),
Partner(state='arkansas', name='ayo', logo='int.png')
]
}
d2 = {
'Ohio':
[
Partner(state='Ohio', name='shmo', logo='123.png', link=''),
Partner(state='Ohio', name='joe', logo='png', link='')
],
'Alaska':
[
Partner(state='Alaska', name='yo',logo='321.png', link='')
],
'arkansas' :
[
Partner(state='arkansas',name='yo',logo='321.png', link='')
]
}
the function you may look for
'''
the function
'''
def strange_transform(strange_dictionary):
new_strange_dictionary = {}
for key in strange_dictionary:
l = strange_dictionary[key]
print key
print type(l), l
for element in l:
state_name = element.state
first_char = state_name[:1]
print state_name, first_char, type(element), str(element)
if new_strange_dictionary.has_key(first_char):
matching_inner_dict_found = False
for inner_dict in new_strange_dictionary[first_char]:
if inner_dict.has_key(state_name):
matching_inner_dict_found = True
inner_dict[state_name].append(element)
if matching_inner_dict_found == False:
new_strange_dictionary[first_char].append({state_name:[element,]})
else:
new_strange_dictionary[first_char] = [{state_name:[element,]}]
return new_strange_dictionary
print '#################################'
print strange_transform(d1)
Upvotes: 1
Reputation: 95957
So, here's a complete set-up:
from collections import namedtuple
Partner = namedtuple('Partner', 'state name logo link')
d1 = {'o': [Partner(state='Ohio', name='hi', logo='pic.png', link='http'),
Partner(state='Ohio', name='ayo', logo='int.png',link='http')],
'a':[Partner(state='alaska', name='hi', logo='pic.png', link='http'),
Partner(state='arkansas', name='ayo', logo='int.png', link='http')]}
d2 = {'Ohio': [Partner(state='Ohio', name='shmo', logo='123.png',
link=''), Partner(state='Ohio', name='joe', logo='png', link='')],
'Alaska': [Partner(state='Alaska', name='yo',logo='321.png',
link='')], 'Arkansas':[Partner(state='arkansas',name='yo',logo='321.png', link='')]}
Then simply use the usual grouping idiom, here using a defaultdict:
In [4]: from collections import defaultdict
In [5]: from itertools import chain
In [6]: foo = defaultdict(lambda: defaultdict(list))
In [7]: for sub in chain(d1.values(), d2.values()):
...: for partner in sub:
...: first = partner.state.lower()[0]
...: foo[first][partner.state.capitalize()].append(partner)
...:
In [8]: foo
Out[8]:
defaultdict(<function __main__.<lambda>>,
{'a': defaultdict(list,
{'Alaska': [Partner(state='alaska', name='hi', logo='pic.png', link='http'),
Partner(state='Alaska', name='yo', logo='321.png', link='')],
'Arkansas': [Partner(state='arkansas', name='ayo', logo='int.png', link='http'),
Partner(state='arkansas', name='yo', logo='321.png', link='')]}),
'o': defaultdict(list,
{'Ohio': [Partner(state='Ohio', name='hi', logo='pic.png', link='http'),
Partner(state='Ohio', name='ayo', logo='int.png', link='http'),
Partner(state='Ohio', name='shmo', logo='123.png', link=''),
Partner(state='Ohio', name='joe', logo='png', link='')]})})
Note, I've made some assumptions about the case you want, i.e. the first level of the dictionary is lower-case, the second level (the states) are capitalized, but you can modify that to whatever you feel is best.
Upvotes: 1
Reputation: 511
This is propably the solution you are looking for:
dict_1 = {'o': [Partner(state='Ohio', name='hi',logo='pic.png',link='http'),
Partner(state='Ohio', name='ayo', logo='int.png',)],
'a':[Partner(state='alaska', name='hi', logo='pic.png', link='http'),
Partner(state='arkansas', name='ayo', logo='int.png',)]}
dict_2 = {'Ohio': [Partner(state='Ohio',name='shmo',logo='123.png',link=''),
Partner(state='Ohio', name='joe', logo='png', link='')],
'Alaska': [Partner(state='Alaska', name='yo',logo='321.png', link='')],
'arkansas': [Partner(state='arkansas',name='yo',logo='321.png', link='')]}
foo = {}
for key_1,value_1 in dict_1.items():
for key_2,value_2 in dict_2.items():
if key_2.lower().startswith(key_1):
if key_1 not in foo:
foo[key_1] = [{key_2:value_2}]
elif key_1 in foo:
foo.get(key_1).append({key_2:value_2})
Upvotes: 3