有两个词典,并希望以某种方式组合它们

时间:2017-11-02 17:09:47

标签: python python-2.7 python-3.x

所需词典格式:

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]}]}

我目前拥有的词典:

第一个:

{'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',)]})

第二个:

 {'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': 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}

甚至列表!

dict_keys(['a', 'm', 'o', 't'])

我尝试使用

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

3 个答案:

答案 0 :(得分:3)

这可能是您正在寻找的解决方案:

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})

答案 1 :(得分:1)

所以,这是一个完整的设置:

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='')]}

然后简单地使用通常的分组习惯用法,这里使用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='')]})})

注意,我已经对你想要的案例做了一些假设,即字典的第一级是小写,第二级(状态)是大写的,但是你可以根据自己的想法修改它是最好的。

答案 2 :(得分:1)

我很难猜到,你期望得到什么确切的结果。 也许这个?

为#34;合作伙伴&#34;

创建一个简单的课程
'''
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

美化您的数据

'''
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
'''
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)