Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何组合两个元组列表以创建嵌套字典?_Python - Fatal编程技术网

Python 如何组合两个元组列表以创建嵌套字典?

Python 如何组合两个元组列表以创建嵌套字典?,python,Python,我有两个元组列表,如: tin = [ ('a1', 'meow'), ('b1', 'woof'), ('c1', 'mooo'), ('d1', 'oink'), ] rop = [ ('b1', 'forest'), ('a1', 'home'), ('d1', 'shed'), ] 如何将它们合并到一个字典中,使结果如下所示: full = [

我有两个元组列表,如:

tin = [
       ('a1', 'meow'),
       ('b1', 'woof'),
       ('c1', 'mooo'),
       ('d1', 'oink'),
      ]



rop = [
       ('b1', 'forest'),
       ('a1', 'home'),
       ('d1', 'shed'),
      ]
如何将它们合并到一个字典中,使结果如下所示:

full = [
        {'a1' : {'sound': 'meow',
                 'place': 'home'}

        {'b1' : {'sound': 'woof',
                 'place': 'forest'}

        {'c1' : {'sound': 'mooo',
                 'place': None}

        {'d1' : {'sound': 'oink',
                 'place': 'shed'}
       ]
我让它这样工作:

    my_dict = {}

    for k, v in tin :

        if not my_dict.get(k):
            my_dict[k] = {}
            my_dict[k]['sound'] = v 

        else:
            my_dict[k]['sound'] = v 

    for k, v in rop:

        if not my_dict.get(k):
            my_dict[k] = {}
            my_dict[k]['place'] = v 

        else:
            my_dict[k]['place'] = v 
{
 'a1': {'place': 'home',   'sound': 'meow'},
 'b1': {'place': 'forest', 'sound': 'woof'},
 'c1': {'place': None,     'sound': 'mooo'},
 'd1': {'place': 'shed',   'sound': 'oink'}
}

但是它非常冗长,我认为应该有更具python风格的东西。

使用一个简单的迭代

演示:

输出:

{'a1': {'sound': 'meow', 'place': 'home'}, 'b1': {'sound': 'woof', 'place': 'forest'}, 'c1': {'sound': 'mooo', 'place': None}, 'd1': {'sound': 'oink', 'place': 'shed'}}
您可以使用itertools.groupby:

输出:

{'a1': {'sound': 'meow', 'place': 'home'}, 'b1': {'sound': 'woof', 'place': 'forest'}, 'c1': {'sound': 'mooo', 'place': None}, 'd1': {'sound': 'oink', 'place': 'shed'}}
您确定要将全部内容作为列表吗?如果你说它应该是一个dict,那么它应该是这样的:

    my_dict = {}

    for k, v in tin :

        if not my_dict.get(k):
            my_dict[k] = {}
            my_dict[k]['sound'] = v 

        else:
            my_dict[k]['sound'] = v 

    for k, v in rop:

        if not my_dict.get(k):
            my_dict[k] = {}
            my_dict[k]['place'] = v 

        else:
            my_dict[k]['place'] = v 
{
 'a1': {'place': 'home',   'sound': 'meow'},
 'b1': {'place': 'forest', 'sound': 'woof'},
 'c1': {'place': None,     'sound': 'mooo'},
 'd1': {'place': 'shed',   'sound': 'oink'}
}
由以下代码生成:

# note: converting tin and rop to dict:
tin = dict(tin)
rop = dict(rop)

full = {}
for k in set(tin.keys()) | set(rop.keys()):
    full[k] = {'sound': tin.get(k, None), 'place': rop.get(k, None)}
顺便说一下,如果你真的想要一个目录列表,请使用以下命令:

full = []
for k in set(tin.keys()) | set(rop.keys()):
    full.append({k: {'sound': tin.get(k, None), 'place': rop.get(k, None)}})