Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_List_Dictionary_Indexing - Fatal编程技术网

根据python中的索引合并两个包含列表的字典

根据python中的索引合并两个包含列表的字典,python,list,dictionary,indexing,Python,List,Dictionary,Indexing,我有两个列表包含多个字典,每个字典都有一个列表作为值,这些是我的列表: list1 = [{'a':[12,22,61],'b':[21,12,50]},{'c':[10,11,47],'d':[13,20,45],'e':[11,24,42]},{'a':[12,22,61],'b':[21,12,50]}] list2 = [{'f':[21,23,51],'g':[11,12,44]},{'h':[22,26,68],'i':[12,9,65],'j':[10,12,50]},{'f':[

我有两个列表包含多个字典,每个字典都有一个列表作为值,这些是我的列表:

list1 = [{'a':[12,22,61],'b':[21,12,50]},{'c':[10,11,47],'d':[13,20,45],'e':[11,24,42]},{'a':[12,22,61],'b':[21,12,50]}]
list2 = [{'f':[21,23,51],'g':[11,12,44]},{'h':[22,26,68],'i':[12,9,65],'j':[10,12,50]},{'f':[21,23,51],'g':[11,12,44]}]
在我的情况下,我需要将这些列表与此规则合并:

  • 第一个列表(列表1)中的字典只能由合并 第二个列表(list2)中具有相同列表索引的字典
  • 合并这两个列表后,每个字典必须根据其值的第三个数字进行排序
  • 这是基于上述两条规则的预期结果:

    result = [
        {'a':[12,22,61],'f':[21,23,51],'b':[21,12,50],'g':[11,12,44]},
        {'h':[22,26,68],'i':[12,9,65],'j':[10,12,50],'c':[10,11,47],'d':[13,20,45],'e':[11,24,42]},
        {'a':[12,22,61],'f':[21,23,51],'b':[21,12,50],'g':[11,12,44]}
        ]
    
    我该怎么做?可以用python进行内联循环吗?

    试试:

    [dict(a, **b) for a,b in zip(list1, list2)]
    

    对于结果,您可以这样做:

    r = map(lambda x,y:dict(x.items() + y.items()), list1, list2)
    
    结果:

    [{'a': [12, 22, 61], 'b': [21, 12, 50], 'g': [11, 12, 44], 'f': [21, 23, 51]},
     {'c': [10, 11, 47], 'e': [11, 24, 42], 'd': [13, 20, 45], 'i': [12, 9, 65], 'h': [22, 26, 68], 'j': [10, 12, 50]},
     {'a': [12, 22, 61], 'b': [21, 12, 50], 'g': [11, 12, 44], 'f': [21, 23, 51]}]
    

    字典不是按性质排序的,所以如果您不需要对它们进行排序,您可以将它们合并到一行中

    result = [ {**d1, **d2} for d1, d2 in zip(list1, list2) ] # python 3.5+
    
    如果您使用的是较低版本,请定义一个合并函数

    def merge(d1, d2):
        result = d1.copy()
        result.update(d2)
        return result
    
    然后有

    result = [ merge(d1, d2) for d1, d2 in zip(list1, list2) ]
    
    如果您确实需要对它们进行排序,那么您唯一的选择就是使用OrderedICT

    from collections import OrderedDict
    
    def merge(d1, d2):
        tempD = d1.copy()
        tempD.update(d2)
        return OrderedDict(sorted(tempD.items(), key = lambda t: t[1][2], reverse = True))
    
    result = [ merge(d1, d2) for d1, d2 in zip(list1, list2) ]
    
    python 3.5+甚至更短

    result = [ OrderedDict(sorted(({**d1, **d2}).items(), key = lambda t: t[1][2], reverse = True)) for d1, d2 in zip(list1, list2) ]
    
    在一行中(如果不计入导入):


    这在Python 2.7中起作用。

    所谓“内联”循环,是指使用理解结构吗?当然不过,使用for语句可能会更清楚。“你试过什么了吗?你不能给字典排序,它们天生就是无序的。”我说得好。我本来想让OP对列表值进行排序?否则,您无法对字典进行排序。即使这样,也很棘手,因为您只能通过以正确的顺序构造它们来对它们进行排序。在较旧的Python上,您可以使用标准库附带的OrderedDict数据类型。但也许您可以找到另一种更适合您的问题的数据类型。很抱歉,这是不正确的,请参阅OP的第二个要求:合并这两个列表后,每个字典都必须根据其值的第三个数字进行排序。尝试第二个要求排序的数据。@iled+1作为您的答案。很抱歉,这是不正确的,请参阅OP的第二个要求:合并这两个列表后,必须根据其值的第三个数字对每个词典进行排序。正如您问题下面的注释中提到的某个人,无法对词典(元素)进行排序。是的,
    someone==iled
    。哦,是的,我的错!没有看到你的名字。现在可以了(CPython 3.6+@Faizalprbw-yw!如果有任何部分需要解释,请告诉我。此外,您可能会发现相关问题非常有用,例如。实际上,这是我问题的一个非常简单的示例,我有一个大json数据包含与此相同的结构。。但你们的例子是有效的,现在我试图理解你们自己的语法,如果我被卡住了,我会问你们。。非常感谢@伊莱德苏。基本上这里有两个主要问题:1。合并词典;2.对字典进行分类。对于第一部分,您可能会发现非常有用。关于第二点,请参见我之前评论中的链接。用于包装这些内容的语法是列表理解和。请注意,这对python 3不起作用,结果不再包含字典,并且在这种情况下使用
    orderedict
    不会改变任何内容。@StevenSummers谢谢,我的
    sorted
    orderedict
    顺序错误。我没有使用Python3,很抱歉没有首先指定它。
    from collections import OrderedDict
    
    [OrderedDict(sorted(dict(d1.items() + d2.items()).items(), key=lambda x: x[1][-1],
                        reverse=True)) for d1, d2 in zip(list1, list2)]
    
    [OrderedDict([('a', [12, 22, 61]),
                  ('f', [21, 23, 51]),
                  ('b', [21, 12, 50]),
                  ('g', [11, 12, 44])]),
     OrderedDict([('h', [22, 26, 68]),
                  ('i', [12, 9, 65]),
                  ('j', [10, 12, 50]),
                  ('c', [10, 11, 47]),
                  ('d', [13, 20, 45]),
                  ('e', [11, 24, 42])]),
     OrderedDict([('a', [12, 22, 61]),
                  ('f', [21, 23, 51]),
                  ('b', [21, 12, 50]),
                  ('g', [11, 12, 44])])]