从多个列表创建一个字典,一个列表作为键,另一个作为值
Create a dictionary from multiple lists, one list as key, other as value
假设我有这些列表:
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))
使用 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 值元组的迭代器:
Otherwise, the positional argument must be an iterable object. Each item in the iterable must itself be an iterable with exactly two objects. The first object of each item becomes a key in the new dictionary, and the second object the corresponding value.
在我上面的示例中,我使用列表理解在单个表达式中生成整个输出列表:
>>> 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()
是错误的工具,因为它 重复使用 每个键的第二个参数。
假设我有这些列表:
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))
使用 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 值元组的迭代器:
Otherwise, the positional argument must be an iterable object. Each item in the iterable must itself be an iterable with exactly two objects. The first object of each item becomes a key in the new dictionary, and the second object the corresponding value.
在我上面的示例中,我使用列表理解在单个表达式中生成整个输出列表:
>>> 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()
是错误的工具,因为它 重复使用 每个键的第二个参数。