【问题标题】:merge values of list of lists with a list of dictionaries将列表列表的值与字典列表合并
【发布时间】:2016-12-22 04:28:50
【问题描述】:
u= [['1', '2'], ['3'], ['4', '5', '6'], ['7', '8', '9', '10']]
v=[{'id': 'a', 'adj': ['blue', 'yellow']}, {'id': 'b', 'adj': ['purple', 'red']}, {'id': 'c', 'adj': ['green', 'orange']}, {'id': 'd', 'adj': ['black', 'purple']}]

我想要:

 result=[ {'id': 'a', 'adj': ['blue', 'yellow'], 'value': '1' },
        {'id': 'a', 'adj': ['blue', 'yellow'], 'value': '2' },
        {'id': 'a', 'adj': ['purple', 'red'], 'value': '3' },
        ...]

我已将u 转换为字典:

m=[]
for i in u:
    s={}
    s['value']=i
    m.append(s)

#>>m= [{'value': ['1', '2']}, {'value': ['3']}, {'value': ['4', '5', '6']}, {'value': ['7', '8', '9', '10']}]

然后尝试应用zip函数...

for i,j in enumerate(v):
    for s,t in enumerate(l):
        if i= =s:
            #zip 2 dictionary together. Stuck here

提前非常感谢!这是我学习编程的第二周。

【问题讨论】:

    标签: python loops indexing


    【解决方案1】:

    您需要压缩,遍历 u,deepcopy 中的每个子列表 v 并添加新的键/值对,最后将新的 dict 附加到列表中:

    from copy import deepcopy
    
    u= [['1', '2'], ['3'], ['4', '5', '6'], ['7', '8', '9', '10']]
    v=[{'id': 'a', 'adj': ['blue', 'yellow']}, {'id': 'b', 'adj': ['purple', 'red']}, {'id': 'c', 'adj': ['green', 'orange']}, {'id': 'd', 'adj': ['black', 'purple']}]
    
    out = []
    # match up corresponding elements fromm both lists
    for dct, sub in zip(v, u):
        # iterate over each sublist
        for val in sub:
            # deepcopy the dict as it contains mutable elements (lists)
            dct_copy = deepcopy(dct)
            # set the new key/value pairing
            dct_copy["value"] = val
            # append the dict to our out list
            out.append(dct_copy)
    from pprint import pprint as pp
    pp(out)
    

    这会给你:

    [{'adj': ['blue', 'yellow'], 'id': 'a', 'value': '1'},
     {'adj': ['blue', 'yellow'], 'id': 'a', 'value': '2'},
     {'adj': ['purple', 'red'], 'id': 'b', 'value': '3'},
     {'adj': ['green', 'orange'], 'id': 'c', 'value': '4'},
     {'adj': ['green', 'orange'], 'id': 'c', 'value': '5'},
     {'adj': ['green', 'orange'], 'id': 'c', 'value': '6'},
     {'adj': ['black', 'purple'], 'id': 'd', 'value': '7'},
     {'adj': ['black', 'purple'], 'id': 'd', 'value': '8'},
     {'adj': ['black', 'purple'], 'id': 'd', 'value': '9'},
     {'adj': ['black', 'purple'], 'id': 'd', 'value': '10'}]
    

    dicts 有一个.copy 属性,或者你可以调用dict(dct),但是因为你有可变对象作为值,所以只做一个浅拷贝是行不通的。下面的示例向您展示了实际差异:

    In [19]: d = {"foo":[1, 2, 4]}
    
    In [20]: d1_copy = d.copy() # shallow copy, same as dict(d)
    
    In [21]: from copy import  deepcopy
    
    In [22]: d2_copy = deepcopy(d) # deep copy
    
    In [23]: d["foo"].append("bar")
    
    In [24]: d
    Out[24]: {'foo': [1, 2, 4, 'bar']}
    
    In [25]: d1_copy
    Out[25]: {'foo': [1, 2, 4, 'bar']} # copy also changed
    
    In [26]: d2_copy
    Out[26]: {'foo': [1, 2, 4]} # deepcopy is still the same
    

    what-exactly-is-the-difference-between-shallow-copy-deepcopy-and-normal-assignment

    【讨论】:

    • 哇!非常感谢!!!你怎么做的这么快?!我要花半个小时来研究这个。我花了大约 2 个小时试图弄清楚这一点。谢谢
    • @el347,不用担心,当您在 dict 中有可变对象时,请注意浅拷贝和深拷贝之间的区别,同样的逻辑适用于列表等......并且经常会让人失望
    【解决方案2】:

    在两个列表上应用zip,并创建一个新字典,其中旧字典将相应列表中的值添加为键值条目value编号来自列表

    >>> import pprint, copy
    >>> result = [dict(copy.deepcopy(j), value = ind) for i, j in zip(u, v) for ind in i]
    >>> pprint.pprint(result)
    [{'adj': ['blue', 'yellow'], 'id': 'a', 'value': '1'},
     {'adj': ['blue', 'yellow'], 'id': 'a', 'value': '2'},
     {'adj': ['purple', 'red'], 'id': 'b', 'value': '3'},
     {'adj': ['green', 'orange'], 'id': 'c', 'value': '4'},
     {'adj': ['green', 'orange'], 'id': 'c', 'value': '5'},
     {'adj': ['green', 'orange'], 'id': 'c', 'value': '6'},
     {'adj': ['black', 'purple'], 'id': 'd', 'value': '7'},
     {'adj': ['black', 'purple'], 'id': 'd', 'value': '8'},
     {'adj': ['black', 'purple'], 'id': 'd', 'value': '9'},
     {'adj': ['black', 'purple'], 'id': 'd', 'value': '10'}]
    

    【讨论】:

    • 我也没有。我非常感谢你们,伙计们,你们帮助了我。我要研究两个答案!你做的这么快?!!!太疯狂了。我想和你们一样,伙计们。
    • v[0]["adj"].append("bar") 看看你的结果列表。
    • @PadraicCunningham 这是一个疏忽。好眼力!
    【解决方案3】:

    您可以使用以下代码来获取想要的结果。

    result = []
    for index, d in enumerate(u):
        for value in d:
            result.append(dict(v[index], value=value))
    

    它遍历uenumerate-ion,然后将正确的v dict 和value 的组合附加到result 列表中。

    您可以使用列表推导将其压缩成一个相对干净的单行。

    result = [dict(v[index], value=value) for index, d in enumerate(u) for value in d]
    

    【讨论】:

      猜你喜欢
      • 2019-03-12
      • 2021-04-26
      • 1970-01-01
      • 2014-12-19
      • 2021-02-12
      • 2021-07-29
      • 2013-04-06
      • 2020-05-30
      • 1970-01-01
      相关资源
      最近更新 更多