代码之家  ›  专栏  ›  技术社区  ›  user14073111

从多个列表中创建字典,一个列表作为键,另一个列表作为值

  •  0
  • user14073111  · 技术社区  · 3 年前

    假设我有以下清单:

    key_list = [key1, key2,.....,key20]
    val_list = [[val1, val2,...,val20],[val1, val2,...,val20], [val1, val2,...,val20],....,[val1, val2,...,val20]]
    

    我怎样才能使用第一个列表作为键,然后遍历第二个列表中的每个列表,并制作如下字典:

    {
        "rows": [
        {
            "key1": "val1",
            "key2": "val2",
             .
             .
             .
            "key20": "val20"
        },
        {
            "key1": "val1",
            "key2": "val2",
             .
             .
             .
            "key20": "val20"
        },
        {
            "key1": "val1",
            "key2": "val2",
             .
             .
             .
            "key20": "val20"
        },
        
        {
            "key1": "val1",
            "key2": "val2",
             .
             .
             .
            "key20": "val20"
        },
        .
        .
        .
        {
            "key1": "val1",
            "key2": "val2",
             .
             .
             .
            "key20": "val20"
        }
        
        ]
    }
    

    我试过这个,但它没有给我想要的输出:

    data = []
    for row in val_list:
      t = dict.fromkeys(key_list, row)
      data.append(t)
    print(json.dumps(data, indent=4))
    
    1 回复  |  直到 3 年前
        1
  •  2
  •   Martijn Pieters    3 年前

    使用 zip() function 将键列表与相应的值组合,然后传递 (key, value) 组合到 dict() :

    data = {"rows": [dict(zip(key_list, row)) for row in val_list]}
    

    这是因为 zip(iter1, iter2) 将中的每个元素配对 iter1 和那些 iter2 ,以及 dict() constructor 接受2值元组的迭代器:

    否则,位置参数必须是 iterable 对象iterable中的每个项本身必须是一个只包含两个对象的iterable。每个项的第一个对象成为新字典中的一个键,第二个对象成为相应的值。

    在上面的示例中,我使用列表理解在单个表达式中生成整个输出列表:

    >>> key_list = ['key1', 'key2', 'key3']
    >>> val_list = [['v0_1', 'v0_2', 'v0_3'], ['v1_1', 'v1_2', 'v1_3'], ['v2_1', 'v2_2', 'v2_3']]
    >>> {"rows": [dict(zip(key_list, row)) for row in val_list]}
    {'rows': [{'key1': 'v0_1', 'key2': 'v0_2', 'key3': 'v0_3'}, {'key1': 'v1_1', 'key2': 'v1_2', 'key3': 'v1_3'}, {'key1': 'v2_1', 'key2': 'v2_2', 'key3': 'v2_3'}]}
    >>> from pprint import pp
    >>> pp({"rows": [dict(zip(key_list, row)) for row in val_list]})
    {'rows': [{'key1': 'v0_1', 'key2': 'v0_2', 'key3': 'v0_3'},
              {'key1': 'v1_1', 'key2': 'v1_2', 'key3': 'v1_3'},
              {'key1': 'v2_1', 'key2': 'v2_2', 'key3': 'v2_3'}]}
    

    dict.fromkeys() 这里的工具不对吗 重复使用 每个键的第二个参数。