📌  相关文章
📜  将具有重复键的 ImmutableMultiDict 转换为Python中的列表列表(1)

📅  最后修改于: 2023-12-03 14:53:47.572000             🧑  作者: Mango

将具有重复键的 ImmutableMultiDict 转换为 Python 中的列表列表

在 Flask 中,表单数据通常是通过 request.form 或者 request.values 获取的。这两个属性都是 ImmutableMultiDict 类型的对象,它们的键是唯一的,但是对于值却没有任何限制。在一些场景下,我们需要将这种具有重复键的 ImmutableMultiDict 对象转换成 Python 中的列表列表。本文将介绍如何实现这个功能。

问题描述

假设我们有一个表单,其中包含了以下字段:

<form action="/submit-form" method="POST">
  <label for="fruit">Fruit:</label>
  <select name="fruit">
    <option value="apple">Apple</option>
    <option value="banana">Banana</option>
    <option value="orange">Orange</option>
  </select>
  <br>
  <label for="color">Color:</label>
  <select name="color">
    <option value="red">Red</option>
    <option value="yellow">Yellow</option>
    <option value="orange">Orange</option>
  </select>
  <br>
  <input type="submit" value="Submit">
</form>

当用户在表单中选择多项时,例如选择了两个水果和两个颜色,那么提交表单后,我们可以通过 request.form 获取到如下的 ImmutableMultiDict 对象:

ImmutableMultiDict([('fruit', 'apple'), ('fruit', 'banana'), ('color', 'red'), ('color', 'yellow')])

这里的 ImmutableMultiDict 对象中包含了四个键值对,其中 fruitcolor 键各自有两个值。为了便于处理这种类型的数据,我们需要将其转换成 Python 中的列表列表:

[['fruit', 'apple'], ['fruit', 'banana'], ['fruit', 'red'], ['fruit', 'yellow']]
解决方案

我们可以通过循环遍历 ImmutableMultiDict 对象中的每个键值对,将具有相同键的值合并成一个列表,并将最终结果保存到一个列表中。具体做法如下:

def immutable_multi_dict_to_list_of_lists(imm_dict):
    data = []
    for key, value in imm_dict.items(multi=True):
        if isinstance(value, list):
            for v in value:
                data.append([key, v])
        else:
            data.append([key, value])
    return data

这个函数接受一个 ImmutableMultiDict 对象作为输入,并返回一个列表列表。首先声明一个空列表 data,然后遍历 imm_dict 对象的每个键值对。在 items(multi=True) 方法中,我们将 multi=True 作为参数,这样就可以获取到具有重复键的值。对于每个键值对:

  • 如果值是列表类型,那么就遍历列表中的每个元素,将其与当前键组成一个列表 [key, v],并添加到 data 列表中。
  • 如果值不是列表类型,那么就将当前键值对作为一个列表 [key, value],并添加到 data 列表中。

最后,返回 data 列表即可。

使用样例

下面是如何使用这个函数的样例:

from flask import Flask, request

app = Flask(__name__)

@app.route('/submit-form', methods=['POST'])
def submit_form():
    data = immutable_multi_dict_to_list_of_lists(request.form)
    print(data)
    return 'Form data submitted.'

if __name__ == '__main__':
    app.run(debug=True)

当用户提交表单后,将会输出如下的信息:

[['fruit', 'apple'], ['fruit', 'banana'], ['color', 'red'], ['color', 'yellow']]
总结

本文介绍了如何将具有重复键的 ImmutableMultiDict 转换成 Python 中的列表列表。通过循环遍历 ImmutableMultiDict 对象,并使用一个列表来保存结果,我们可以轻松地实现这个功能。这个方法可以用于处理表单数据,也可以用于解析任何具有类似格式的数据。